Filter(過濾器)


1.什么是Filter(過濾器)?
2.編寫Filter
3.Filter生命周期
4.多個Filter執行順序
5.FilterConfig對象

#什么是Filter(過濾器)?
Filter過濾器是servlet中提供的一個接口,用來攔截請求和響應,從而實現一些特殊處理

#編寫Filter
只需要實現javax.servlet.Filter 接口即可

package com.mike;

import javax.servlet.*;
import java.io.IOException;
/**
 * @author mike
 * @date 2020-11-21
 * @desc 實現一個Filter類
 */

public class MyFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig)throws ServletException{
		System.out.println("Filter初始化");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain)throws ServletException,
	IOException{
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html");
		System.out.println("攔截前"); //在過濾前設置請求和響應編碼
		filterChain.doFilter(request,response);
		System.out.println("攔截后");
	}
}

在web.xml中配置過濾器規則

   <!--配置過濾器-->
    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.mike.MyFilter</filter-class>
    </filter>
    <!--映射過濾器-->
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <!--/* 表示攔截所有請求-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

隨便訪問一個servlet,如http://localhost:8080/helloServlet 觀察輸出信息

#Filter生命周期
在Filter接口中定義了三個方法

package javax.servlet;

import java.io.IOException;

public interface Filter {
    void init(FilterConfig var1) throws ServletException;

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    void destroy();
}

對於這三個方法的介紹:
init(FilterConfig var1):表示Filter對象的初始化方法,在Filter對象創建時執行(只執行一次),並且傳入一個FilterConfig類型的參數,該參數封裝了Filter的 初始化參數。
doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3):表示Filter執行過濾的核心方法,如果某資源在已經被配置到這個Filter進行過濾的話,那么每次訪問這個資源都會執行doFilter方法,注意 這里的request和response沒有http需要強制轉換。
destory():表示Filter銷毀方法,當Filter對象銷毀時執行該方法(僅執行一次)。

#多個Filter執行順序

編寫多個Filter可以組成Filter鏈條,web容器會按照一定的順序執行。當在web.xml中定義Filter規則時,容器會按照filter-mapping配置先后順序執行,如果使用注解配置則按照類名先后執行。當分別在web.xml和注解中都有配置,則先從web.xml中加載,再從注解中加載,第一個Filter的doFilter方法被調用時,Web服務器會創建一個代表Filter鏈的FilterChain對象傳遞給該方法。在doFilter方法中,開發人員如果調用了FilterChain對象的doFilter方法,則Web服務器會檢查FilterChain對象中是否還有Filter,如果還有,則調用第2個Filter,依次類推,直到沒有可以調用目標資源。當有4個Filter,CFilter,BFilter,AFilter,DFilter,其中C,B使用注解,A,D使用web.xml定義,它們的執行順序,如下

FilterConfig對象
FilterConfig對象是Filter在初始化時會讀取web.xml配置中的filter中的init-param配置信息,可通過FilterConfig對象的一些方法可以獲取初始化配置,有如下方法

String getFilterName():返回Filter的名稱。
String getInitParameter(String name): 返回在部署描述中指定名稱的初始化參數的值。如果不存在返回null.
Enumeration getInitParameterNames():返回過濾器的所有初始化參數的名字的枚舉集合。
ServletContext getServletContext():返回Servlet上下文對象的引用。

在web.xml的filter中加入init-param配置信息

  <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.mike.MyFilter</filter-class>
        <!--配置初始化信息-->
        <init-param>
            <param-name>name</param-name>
            <param-value>mike</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>8888</param-value>
        </init-param>
    </filter>

在MyFilter的init中獲取初始化配置

package com.mike;

import javax.servlet.*;
import java.io.IOException;
/**
 * @author mike
 * @date 2020-11-21
 * @desc 實現一個Filter類
 */

public class MyFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig)throws ServletException{ //init方法只會在容器啟動時候調用一次,
		System.out.println("Filter初始化");
		//獲取過濾器名字
		String filterName = filterConfig.getFilterName();
		//獲取web.xml中配置的filter初始化信息
		String name = filterConfig.getInitParameter("name");
		String password = filterConfig.getInitParameter("password");
		System.out.println(name);
		System.out.println(password);
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain)throws ServletException,
	IOException{
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html");
		System.out.println("攔截前");
		filterChain.doFilter(request,response);
		System.out.println("攔截后");
	}
}

隨便訪問一個servlet查看輸出信息 http://localhost:8080/helloServlet

還可通過注解配置filter的init-param,效果和使用web.xml配置一致

package com.mike;

import javax.servlet.*;
import java.io.IOException;
/**
 * @author mike
 * @date 2020-11-21
 * @desc 實現一個Filter類
 */

@WebFilter(filterName = "MyFilter",value = "/*",initParams = {
	  @WebInitParam(name = "name", value = "mike"),/*這里配置初始化的參數*/
          @WebInitParam(name = "password", value = "8888")/*相當於<init-param>*/
})
public class MyFilter implements Filter {
	@Override
	public void init(FilterConfig filterConfig)throws ServletException{
		System.out.println("Filter初始化");
		//獲取過濾器名字
		String filterName = filterConfig.getFilterName();
		//獲取web.xml中配置的filter初始化信息
		String name = filterConfig.getInitParameter("name");
		String password = filterConfig.getInitParameter("password");
		System.out.println(filterName);
		System.out.println(name);
		System.out.println(password);
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain)throws ServletException,
	IOException{
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html");
		System.out.println("攔截前");
		filterChain.doFilter(request,response);
		System.out.println("攔截后");
	}
}


免責聲明!

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



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