過濾器的介紹
- 過濾器——Filter,它是JavaWeb三大元件之一。另外兩個是Servlet和Listener
- 它可以對web應用中的所有資源進行攔截,并且在攔截之後進行一些特殊的操作
- 在程式中通路伺服器資源時,當一個請求到來,伺服器首先判斷是否有過濾器與請求資源相關聯,如果有,過濾器可以将請求攔截下來,完成一些特定的功能,再由過濾器決定是否交給請求資源。如果沒有則像之前那樣直接請求資源了。響應也是類似的!
- 過濾器一般用于完成通用的操作,例如:登入驗證、統一編碼處理、敏感字元過濾等
Filter介紹
- Filter 是一個接口,如果想實作過濾器的功能,必須實作該接口
- 核心方法
傳回值 方法名 作用 void init(FilterConfig config) 初始化方法 void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain) 對請求資源和響應資源過濾 void destory() 銷毀方法 - 配置方式
- 注解方式
- 配置檔案
FilterChain
- FilterChain 是一個接口,代表過濾器鍊對象。由 Servlet 容器提供實作類對象,直接使用即可。
- 過濾器可以定義多個,就會組成過濾器鍊
- 核心方法
傳回值 方法名 作用 void doFilter(ServletRequest req,ServletResponse resp) 放行方法 - 代碼示範:
@WebFilter("/*") public class FilterDemo01 implements Filter{ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("filterDemo01執行了..."); //處理亂碼 servletResponse.setContentType("text/html;charset=UTF-8"); //放行 filterChain.doFilter(servletRequest,servletResponse); } }
Filter過濾器的使用細節
- 配置方式
- 注解方式 @WebFilter(攔截路徑)
- 配置檔案方式
<filter> <filter-name>filter01</filter-name> <filter-class>com.lichee.filter.Demo01</filter-class> </filter> <filter-mapping> <filter-name>filter01</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 多個過濾器使用順序
- 如果有多個過濾器,取決于過濾器映射的順序
- 也就是filter-mapping配置的先後順序
生命周期
- 建立(出生)
- 當應用加載時執行個體化對象并執行 init 初始化方法
- 服務(活着)
- 對象提供服務的過程,執行 doFilter 方法
- 隻要應用一直提供服務,對象就一直存在
- 銷毀(死亡)
- 當應用解除安裝時或伺服器停止時對象銷毀。執行 destroy 方法
- Filter的執行個體對象在記憶體中也隻有一份。是以也是單例的。
- 案例:
@WebFilter("/*") public class FilterDemo03 implements Filter{ //初始化方法 @Override public void init(FilterConfig filterConfig) { System.out.println("對象初始化成功了..."); } //提供服務方法 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("filterDemo03執行了..."); //處理亂碼 servletResponse.setContentType("text/html;charset=UTF-8"); //放行 filterChain.doFilter(servletRequest,servletResponse); } //對象銷毀 @Override public void destroy() { System.out.println("對象銷毀了..."); } }
FilterConfig過濾器配置對象
- FilterConfig 是一個接口。代表過濾器的配置對象,可以加載一些初始化參數。
- 與ServletConfig類似
- 核心方法
傳回值 方法名 作用 String getFilterName() 擷取過濾器對象名稱 String getInitParameter(String key) 根據key過去value Enumeration getInitParameterNames() 獲所有參數的key ServletContext getServletContext() 擷取應用上下文對象
過濾器的五種攔截行為
- Filter 過濾器預設攔截的是請求,但是在實際開發中,我們還有請求轉發和請求包含,以及由伺服器觸發調用的全局錯誤頁面。預設情況下過濾器是不參與過濾的,要想使用,就需要我們配置
- 攔截方式
<filter> <filter-name>filter1</filter-name> <filter-class>com.lichee.filter.Demo1</filter-class> <!--配置開啟異步支援,當dispatcher配置ASYNC時,需要配置此行--> <async-supported>true</async-supported> </filter> <filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/filter1</url-pattern> <!--過濾請求:預設值。--> <dispatcher>REQUEST</dispatcher> <!--過濾全局錯誤頁面:當由伺服器調用全局錯誤頁面時,過濾器工作--> <dispatcher>ERROR</dispatcher> <!--過濾請求轉發:當請求轉發時,過濾器工作。--> <dispatcher>FORWARD</dispatcher> <!--過濾請求包含:當請求包含時,過濾器工作。它隻能過濾動态包含,jsp的include指令是靜态包含,過濾器不會起作用--> <dispatcher>INCLUDE</dispatcher> <!--過濾異步類型,它要求我們在filter标簽中配置開啟異步支援--> <dispatcher>ASYNC</dispatcher> </filter-mapping>