一 Filter簡介
Filter是JavaWeb三大組件之一 Web中的過濾器
當訪問服務器的資源時 過濾器可以將請求攔截下來 完成一些特殊的功能
一般用於通用的操作 比如登錄驗證 統一編碼處理 敏感字符過濾等等
二 新建一個Filter
2. 自定義一個類 實現Filter接口
/** * Filter快速入門 * Created by Hy on 2020/7/2. */ public class FilterDemo1 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("doFilter() 前"); // 放行 filterChain.doFilter(servletRequest, servletResponse); System.out.println("doFilter() 后"); } @Override public void destroy() {} }
3. 配置Filter web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 配置Filter --> <filter> <filter-name>demo1</filter-name> <filter-class>com.hy.filter.FilterDemo1</filter-class> </filter> <filter-mapping> <filter-name>demo1</filter-name> <!-- 攔截路徑 --> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
啟動項目 訪問 http://localhost:8080/index.jsp
三 Filter執行流程
執行過濾器 -> 執行放行后的資源 -> 回來執行過濾器放行代碼下邊的代碼
四 Filter生命周期
/** * Filter生命周期 * Created by Hy on 2020/7/2. */ public class FilterDemo2 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 生命周期方法 創建 // 在Filter被創建時執行 只會執行一次 System.out.println("init()"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 生命周期方法 攔截資源 // 每一次請求被攔截時執行 執行多次 System.out.println("doFilter()"); // 放行 filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { // 生命周期方法 銷毀 // 在服務器正常關閉時執行 只會執行一次 System.out.println("destroy()"); } }
1. 被創建 執行init() 只會執行一次
在服務器啟動時創建
2. 攔截資源 執行doFilter() 執行多次
每次請求被攔截時 doFilter()都會被調用一次
3. 被銷毀 執行destroy() 只會執行一次
Filter被銷毀前執行 服務器正常關閉時 Filter被銷毀
五 Servlet3.0注解
使用注解代替web.xml配置
/** * Servlet3.0注解 * 攔截路徑定義規則 * 1. /index.jsp 具體資源路徑 只有訪問index.jsp資源時 過濾器才會被執行 * 2. /user/* 攔截目錄 訪問/user下的所有資源時 過濾器都會被執行 * 3. *.jsp 擴展名攔截 訪問所有擴展名為jsp資源時 過濾器都會被執行 * 4. /* 攔截所有資源 訪問所有資源時 過濾器都會被執行 * * 攔截方式配置 資源被訪問的方式 * 設置dispatcherTypes屬性 * 1. REQUEST 默認值 瀏覽器直接請求資源 * 2. FORWARD 轉發訪問資源 * 3. INCLUDE 包含訪問資源 * 4. ERROR 錯誤跳轉資源 * 5. ASYNC 異步訪問資源 * 注意: web.xml配置 -> 設置<dispatcher></dispatcher>標簽即可 * Created by Hy on 2020/7/2. */ //@WebFilter("/*") @WebFilter(urlPatterns = "/*", dispatcherTypes = DispatcherType.REQUEST) public class FilterDemo3 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init..."); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("doFilter..."); // 放行 filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { System.out.println("destroy..."); } }
六 過濾器鏈
1. 執行順序 如果有兩個過濾器 過濾器1和過濾器2
過濾器1 -> 過濾器2 -> 資源執行 -> 過濾器2 -> 過濾器1
2. 過濾器先后順序問題
a. 注解配置
按照類名的字符串比較規則 值小的先執行 比如AFilter和BFilter AFilter就先執行
b. web.xml配置
<filter-mapping>誰定義在上邊 誰先執行