Filter過濾器
1.Filter的基本概念:
在Java Servlet中,Filter
接口是用來處理HttpServletRequest和HttpServletResponse的對象的過濾器。主要用途是在請求到達Servlet之前或者響應離開Servlet之前對請求或響應進行預處理或后處理。
2.Filter常見的API
- Filter接口
方法聲明 | 功能描述 |
---|---|
void init(FilterConfig config) | init( )方法是 Filter 的初始化方法,創建 Filter 實例后將調用 init( )方法。該方法的參數filterConfig 用于讀取 Filter 的初始化參數(只執行一次) |
void doFilter (ServletRequest req,ServletResponse resp,FilterChain cahin) | doFilter()方法用于完成實際的過濾操作,當客戶的請求滿足過濾規則時,Servlet容器將調用過濾器的 doFiter()方法完成實際的過濾操作。doFilter( )方法有多個參數,其中,參數request和response為Web 服務器或 Filter 鏈中的上一個 Filter 傳遞過來的請求和響應對象;參數 chain 代表當前 Filter 鏈的對象 |
void destroy() | 該方法用于釋放被 Filter 對象打開的資源,例如關閉數據庫和IO 流。destroy( )方法在Web 服務器釋放 Filter 對象之前被調 |
- FilterConfig接口
用于封裝Filter的配置信息
- FilterChain接口
FilterChain接口中的doFilter(ServletRequest req,ServletResponse resp)方法用來調用Filter鏈中下一個過濾器,如果沒有過濾器調用下一個處理程序
3.Filter生命周期
init():在服務器啟動之后,會創建Filter對象,調用init方法,加載配置
doFilter():每一次請求被攔截資源時會執行,執行多次
destroy():在服務器關閉后,Filter對象會被銷毀,通過調用一次destroy銷毀
4.Filter的配置
實現過濾器
- @WebFilter注解
注意:urlPatterns和value中是要過濾的url
攔截路徑
1.具體資源路徑:/index.jsp
2.攔截目錄:/book/*
3.后綴名攔截:*.jsp
4.攔截所有資源:/*
攔截不同方式的請求
@WebFiler 注解有一個特殊的屬性 dispatcherTypes,它可以指定過濾器的轉發模式。dispatcherTypes屬性有4個常用值,具體如下
(1)REQUEST
過濾器設置 dispatcherTypes 屬性值為 REQUEST 時,如果用戶通過 RequestDispatcher 對象的 include()方法或forward()方法訪問目標資源,那么過濾器不會被調用。除此之外,該過濾器會被調用。
(2)INCLUDE
過濾器設置 dispatcherTypes 屬性值為 INCLUDE 時,如果用戶通過 RequestDispatcher 對象的 include()方法訪問目標資源,那么過濾器將被調用。除此之外,該過濾器不會被調用。
(3)FORWARD
過濾器設置 dispatcherTypes 屬性值為 FORWARD時,如果通過 RequestDispatcher 對象的 forward()方法訪問目標資源,那么過濾器將被調用。除此之外,該過濾器不會被調用。
(4)ERROR
過濾器設置 dispatcherTypes 屬性值為 ERROR 時,如果通過聲明式異常處理機制調用目標資源,那么過濾器將被調用。除此之外,過濾器不會被調用。
- 在web.xml中配置
<filter><filter-name>filter01</filter-name><filter-class>com.tyut.controller.FilterText01</filter-class>
</filter><filter-mapping><filter-name>filter01</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
5.過濾器鏈
- 執行順序
如果有兩個過濾器:過濾器1和過濾器2,執行順序應為
過濾器1 -> 過濾器2 -> 資源執行 -> 過濾器2 -> 過濾器1
- 過濾器先后順序
1.注解配置:按照過濾器名字(filterName)的字符串比較規則比較,值小的先執行(ps:filter01比filter02先執行)
2.web.xml配置:<filter-mapping></filter-mapping>誰定義在上邊,誰先執行
6.案例一:實現登錄驗證
實現了一個簡單的登錄過濾器,用于攔截所有請求并檢查用戶是否已登錄。如果用戶未登錄,則會將請求重定向到登錄頁面;如果用戶已登錄,則允許訪問其他頁面或資源。這種過濾器在Web應用中常用于確保特定頁面或功能只能被授權的用戶訪問,提高系統的安全性和用戶體驗。
package com.tyut;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;@WebFilter({"/*"})
public class LoginFilter implements Filter {public void init(FilterConfig config) throws ServletException {}public void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {//1.將request轉換HttpServletRequestHttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;//2.判斷是否是有關登錄的信息String requestURI = req.getRequestURI();//如果是有關登錄的頁面,可以訪問if (requestURI.contains("/login.jsp") || requestURI.contains("/LoginServlet") || requestURI.contains("/login.css")) {chain.doFilter(req, resp);} else {//必須登錄以后才可以訪問到其他頁面//3.判斷用戶是否存在HttpSession session = req.getSession();if (session.getAttribute("user") != null) {//用戶存在chain.doFilter(request, response);//放行} else {req.getRequestDispatcher("/login.jsp").forward(req, resp);}}}
}