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時 (瀏覽器輸入訪問路徑:)
上面是存在放行程式碼的時候,如果沒有放行請求,就不會執行響應!!
正常關閉伺服器時銷燬