Filter


一 Filter簡介

Filter是JavaWeb三大組件之一 Web中的過濾器

當訪問服務器的資源時 過濾器可以將請求攔截下來 完成一些特殊的功能

一般用於通用的操作 比如登錄驗證 統一編碼處理 敏感字符過濾等等

 

二 新建一個Filter

1. 新建一個Web項目

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>誰定義在上邊 誰先執行

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM