1. 程式人生 > >Filter過濾器(如何建立,生命週期,執行流程)

Filter過濾器(如何建立,生命週期,執行流程)

Filter過濾器是什麼??

       開發人員可以實現使用者在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲進行處理。

過濾器就相當於是一個濾紙用來過濾條件的~~

過濾器鏈:多個過濾器

多個過濾器的執行順序:(注意:請求和響應是相反的
請求時是:A --> B --> C
響應時是:C --> B --> A

如何實現過濾器??

①自定義類去實現Filter介面

public class MyFilter implements Filter {

	@Override
	public void init(FilterConfig config) throws ServletException {
		System.out.println("===過濾器初始化===");
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("===過濾器執行===");
		//放行請求
		chain.doFilter(req, resp);
		System.out.println("===放行之後會執行響應...===");
	}
	
	@Override
	public void destroy() {
		System.out.println("===過濾器銷燬===");
	}

}

②在web.xml中配置或者使用註解配置@WebFilter("過濾器路徑")   注意:不推薦使用註解配置)

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0" metadata-complete="false">
  
    <filter>
		<filter-name>a</filter-name>
		<filter-class>com.zhengqing.filter.MyFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>a</filter-name>
		<!-- url-pattern:需要過濾的訪問路徑 -->
		<url-pattern>/index.jsp</url-pattern>
	</filter-mapping>

</web-app>

為什麼不使用註解配置??

和過濾器鏈(多個過濾器)有關!!

過濾器鏈的執行需要順序     ----    註解確定不了順序,但使用配置可以!!

配置如何確定順序??      ==》  根據過濾範圍從上到下與<filter-mapping>的配置順序有關

為什麼需要在web.xml中配置??   

因為過濾器的功能作用於路徑上  也就是我們在web.xml中所配置的url-pattern (/index.jsp:過濾index.jsp一個具體的路徑      /*:過濾所有路徑   ...)

過濾器的生命週期???

tomcat伺服器啟動時建立 --> 初始化(init) --> 執行(doFilter)[每次請求/響應都執行] --> 銷燬(destroy)(伺服器正常關閉時銷燬)

過濾器通過什麼方式讓請求通過??

放行請求程式碼:FilterChain物件.doFilter(請求物件,響應物件)

過濾器請求和響應的執行順序??

請求的時候 : 執行放行上面的程式碼
響應的時候 : 執行放行下面的程式碼


ex: 結合過濾器生命週期來一起看執行順序吧!

我的index.jsp頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"   %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首頁</title>
</head>
<body>
	<%
		System.out.println("===index首頁執行===");
	%>
	這是首頁
</body>
</html>

tomcat伺服器啟動時會建立過濾器然後初始化...

當我們訪問index.jsp時  (瀏覽器輸入訪問路徑:)

上面是存在放行程式碼的時候,如果沒有放行請求,就不會執行響應!!

正常關閉伺服器時銷燬