Java Filter過濾器(攔截路徑的配置+攔截方式的配置+生命週期+多個過濾器的先後執行順序)

一隻胡說八道的猴子發表於2020-08-08

Java Filter過濾器+Listen監聽器

啥是過濾器

顧名思義即過濾掉一些東西,比如我們經歷的高考中考都是過濾器,他過濾掉一些在學習這一方面不是很好的人,而那些成績好的人則升入高中,大學。
在這裡插入圖片描述

但是java中的過濾器與生活中的過濾器的作用是相差無幾的,即按照制定的一些規則來控制一些物件

Filer的作用:

過濾器是出於客戶端與伺服器端之間的一道過濾網,在訪問資源之前,通過一系列的過濾器對請求
進行修改,判斷等。把不符合規則的請求在中途攔截或修改,攔截或修改響應

在這裡插入圖片描述

如何建立使用一個Filter

1.定義一個類實現介面Filter(java.servlet)

import javax.servlet.*;
import java.io.IOException;

public class Filter1 implements javax.servlet.Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    @Override
    public void destroy() {

    }
}

Filer的生命週期:

1.init:在伺服器啟動後,會建立Filter物件,然後呼叫init方法,只執行一次用於載入資源
2.doFilter:每一次請求被攔截都會執行
3.destory:在伺服器關閉後,Filter物件會被銷燬,如何伺服器物件正常關閉,destory方法會被執行一次
用於釋放資源

2.複寫方法
3.設定攔截路徑
設定攔截路徑有兩種方法,一種是註解配置,一種是設定web.xml

註解配置

即加上一個@WebFilter("")

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class Filter1 implements javax.servlet.Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    }
    @Override
    public void destroy() {
    }
}

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_3_1.xsd"
         version="3.1">
    <filter>
        <filter-name>demo1</filter-name>
        <filter-class>Filter1</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>demo1</filter-name>
        //設定攔截路徑
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

攔截路徑配置的講解
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配置
    * 設定標籤即可

過濾器的執行流程:

1.執行過濾器
2.執行放行後的資源
3.執行過濾器放行器程式碼下邊的程式碼

過濾器鏈(配置多個過濾器)

執行順序
如果有兩個過濾器:過濾器1和過濾器2
1. 過濾器1
2. 過濾器2
3. 資源執行
4. 過濾器2
5. 過濾器1

看圖按照從左到右的順序來看就好理解了
在這裡插入圖片描述
那麼有了多個過濾器之後又是怎麼來判斷那個過濾器先哪個過濾器後的呢?
是隨機判斷的?
在這裡插入圖片描述
當然不是啦

過濾器先後執行順序的判斷方法

1. 註解配置
按照類名的字串比較規則比較,值小的先執行

  • 如: AFilter 和 BFilter,AFilter就先執行了。
    2. web.xml配置
    誰定義在上邊,誰先執行

以上就是Filter的一些基礎知識,寫作不易,請各位老鐵點個贊支援一下,覺得有幫助的也可以收藏呀,我會經常更新文章,也可以關注我呀

在這裡插入圖片描述

相關文章