中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行Servlet過濾器的概念及結構淺析

發布時間:2021-12-18 18:34:00 來源:億速云 閱讀:147 作者:柒染 欄目:編程語言

如何進行Servlet過濾器的概念及結構淺析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1.Servlet 過濾器是什么?

Servlet 過濾器是小型的 Web 組件,它們攔截請求和響應,以便查看、提取或以某種方式操作正在客戶機和服務器之間交換的數據。過濾器是通常封裝了一些功能的 Web 組件,這些功能雖然很重要,但是對于處理客戶機請求或發送響應來說不是決定性的。典型的例子包括記錄關于請求和響應的數據、處理安全協議、管理會話屬性,等等。過濾器提供一種面向對象的模塊化機制,用以將公共任務封裝到可插入的組件中,這些組件通過一個配置文件來聲明,并動態地處理。

Servlet 過濾器中結合了許多元素,從而使得過濾器成為獨特、強大和模塊化的 Web 組件。也就是說,Servlet 過濾器是:

◆聲明式的 :過濾器通過 Web 部署描述符(web.xml)中的 XML 標簽來聲明。這樣允許添加和刪除過濾器,而無需改動任何應用程序代碼或 JSP 頁面。

◆動態的 :過濾器在運行時由 Servlet 容器調用來攔截和處理請求和響應。

◆靈活的 :過濾器在 Web 處理環境中的應用很廣泛,涵蓋諸如日志記錄和安全等許多最公共的輔助任務。過濾器還是靈活的,因為它們可用于對來自客戶機的直接調用執行預處理和后期處理,以及處理在防火墻之后的 Web 組件之間調度的請求。***,可以將過濾器鏈接起來以提供必需的功能。

◆模塊化的 :通過把應用程序處理邏輯封裝到單個類文件中,過濾器從而定義了可容易地從請求/響應鏈中添加或刪除的模塊化單元。

◆可移植的 :與 Java 平臺的其他許多方面一樣,Servlet 過濾器是跨平臺和跨容器可移植的,從而進一步支持了 Servler 過濾器的模塊化和可重用本質。

◆可重用的 :歸功于過濾器實現類的模塊化設計,以及聲明式的過濾器配置方式,過濾器可以容易地跨越不同的項目和應用程序使用。

◆透明的 :在請求/響應鏈中包括過濾器,這種設計是為了補充(而不是以任何方式替代)servlet 或 JSP 頁面提供的核心處理。因而,過濾器可以根據需要添加或刪除,而不會破壞 servlet 或 JSP 頁面。

2.Servlet 過濾器體系結構

正如其名稱所暗示的, Servlet 過濾器用于攔截傳入的請求和/或傳出的響應,并監視、修改或以某種方式處理正在通過的數據流。過濾器是自包含、模塊化的組件,可以將它們添加到請求/響應鏈中,或者在無需影響應用程序中其他 Web 組件的情況下刪除它們。過濾器僅只是改動請求和響應的運行時處理,因而不應該將它們直接嵌入 Web 應用程序框架,除非是通過 Servlet API 中良好定義的標準接口來實現。

Web 資源可以配置為沒有過濾器與之關聯(這是默認情況)、與單個過濾器關聯(這是典型情況),甚至是與一個過濾器鏈相關聯。那么過濾器究竟做什么呢? 像 servlet 一樣,它接受請求并響應對象。然后過濾器會檢查請求對象,并決定將該請求轉發給鏈中的下一個組件,或者中止該請求并直接向客戶機發回一個響應。如果請求被轉發了,它將被傳遞給鏈中的下一個資源(另一個過濾器、servlet 或 JSP 頁面)。在這個請求設法通過過濾器鏈并被服務器處理之后,一個響應將以相反的順序通過該鏈發送回去。這樣就給每個過濾器都提供了根據需要處理響應對象的機會。

當過濾器在 Servlet 2.3 規范中***引入時,它們只能過濾 Web 客戶機和客戶機所訪問的指定 Web 資源之間的內容。如果該資源然后將請求調度給其他 Web 資源,那就不能向幕后委托的任何請求應用過濾器。2.4 規范消除了這個限制。Servlet 過濾器現在可以應用于 J2EE Web 環境中存在請求和響應對象的任何地方。因此,Servlet 過濾器可以應用在客戶機和 servlet 之間、servlet 和 servlet 或 JSP 頁面之間,以及所包括的每個 JSP 頁面之間。這才是我所稱的強大能力和靈活性!

3.編寫Servlet過濾器實現類的程序

過濾器 API 包含 3 個簡單的接口,它們整潔地嵌套在 javax.servlet 包中。那 3 個接口分別是 Filter 、 FilterChain 和 FilterConfig 。從編程的角度看,過濾器類將實現 Filter 接口,然后使用這個過濾器類中的 FilterChain 和 FilterConfig 接口。該過濾器類的一個引用將傳遞給 FilterChain 對象,以允許過濾器把控制權傳遞給鏈中的下一個資源。 FilterConfig 對象將由容器提供給過濾器,以允許訪問該過濾器的初始化數據。

為了與我們的三步模式保持一致,過濾器必須運用三個方法,以便完全實現 Filter 接口:

init() :這個方法在容器實例化過濾器時被調用,它主要設計用于使過濾器為處理做準備。該方法接受一個 FilterConfig 類型的對象作為輸入。

doFilter() :與 servlet 擁有一個 service() 方法(這個方法又調用 doPost() 或者 doGet() )來處理請求一樣,過濾器擁有單個用于處理請求和響應的方法?D?D doFilter() 。這個方法接受三個輸入參數:一個 ServletRequest 、 response 和一個 FilterChain 對象。

destroy() :正如您想像的那樣,這個方法執行任何清理操作,這些操作可能需要在自動垃圾收集之前進行。

SessionFilter.java  package net.pms.web.filter;   import java.io.IOException;   import javax.servlet.Filter;  import javax.servlet.FilterChain;  import javax.servlet.FilterConfig;  import javax.servlet.ServletException;  import javax.servlet.ServletRequest;  import javax.servlet.ServletResponse;  import javax.servlet.http.HttpServletRequest;  import javax.servlet.http.HttpServletResponse;  import javax.servlet.http.HttpServletResponseWrapper;   /**  * @author jfish  * @since 2006.1.12  */  public class SessionFilter implements Filter {        public static boolean isContains(String container, String[] regx) {             boolean result = false;              for (int i = 0; i ﹤ regx.length; i++) {                   if (container.indexOf(regx[i]) != -1) {                         return true;                   }             }             return result;       }        public FilterConfig config;        public void setFilterConfig(FilterConfig config) {             this.config = config;       }        public FilterConfig getFilterConfig() {             return config;       }        public void doFilter(ServletRequest request, ServletResponse response,                   FilterChain chain) throws IOException, ServletException {              HttpServletRequest httpreq = (HttpServletRequest) request;             HttpServletResponse httpres = (HttpServletResponse) response;              HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(                         (HttpServletResponse) response);             String logonStrings = config.getInitParameter("logonStrings");             String includeStrings = config.getInitParameter("includeStrings");             String redirectPath = httpreq.getContextPath()                         + config.getInitParameter("redirectPath");             String disabletestfilter = config.getInitParameter("disabletestfilter");              if (disabletestfilter.toUpperCase().equals("Y")) {                   chain.doFilter(request, response);                   return;             }             String[] logonList = logonStrings.split(";");             String[] includeList = includeStrings.split(";");             Object user = httpreq.getSession().getAttribute("userinfo");             if (user == null) {                   if (!this.isContains(httpreq.getRequestURI(), includeList)) {                         chain.doFilter(request, response);                         return;                   }                   if (this.isContains(httpreq.getRequestURI(), logonList)) {                         chain.doFilter(request, response);                         return;                   }                   wrapper.sendRedirect(redirectPath);              } else {                   chain.doFilter(request, response);             }       }        public void destroy() {             this.config = null;       }        public void init(FilterConfig filterConfig) throws ServletException {             this.config = filterConfig;       }  }

4.配置Servlet 過濾器

在web.xml中:

  ﹤filter﹥       ﹤filter-name﹥SessionFilter﹤/filter-name﹥       ﹤filter-class﹥net.pms.web.filter.SessionFilter﹤/filter-class﹥       ﹤init-param﹥             ﹤param-name﹥logonStrings﹤/param-name﹥             ﹤param-value﹥login.jsp﹤/param-value﹥       ﹤/init-param﹥       ﹤init-param﹥             ﹤param-name﹥includeStrings﹤/param-name﹥             ﹤param-value﹥.jsp;.html﹤/param-value﹥       ﹤/init-param﹥       ﹤init-param﹥             ﹤param-name﹥redirectPath﹤/param-name﹥             ﹤param-value﹥/login.jsp﹤/param-value﹥       ﹤/init-param﹥       ﹤init-param﹥             ﹤param-name﹥disabletestfilter﹤/param-name﹥             ﹤param-value﹥N﹤/param-value﹥       ﹤/init-param﹥  /filter﹥  ﹤filter-mapping﹥       ﹤filter-name﹥SessionFilter﹤/filter-name﹥       ﹤url-pattern﹥/*﹤/url-pattern﹥  /filter-mapping﹥

其中參數logonStrings,登陸頁面

includeStrings,過濾頁面參數

redirectPath,沒有登陸轉向頁面

disabletestfilter,Servlet過濾器是否有效。

看完上述內容,你們掌握如何進行Servlet過濾器的概念及結構淺析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

金平| 红安县| 合川市| 太谷县| 澎湖县| 金塔县| 阳朔县| 汤原县| 南充市| 枞阳县| 礼泉县| 青田县| 都昌县| 防城港市| 临西县| 兴山县| 莎车县| 保靖县| 顺昌县| 天长市| 文山县| 项城市| 登封市| 紫金县| 环江| 呼图壁县| 策勒县| 上栗县| 阜平县| 渑池县| 眉山市| 泰宁县| 友谊县| 阿荣旗| 屯昌县| 普定县| 伊川县| 札达县| 肥西县| 永定县| 罗源县|