概述
? ? ? ? Java 過濾器是 Java EE (Jakarta EE) 中的一種組件,用于在請求到達 Servlet 或 JSP 之前對其進行預處理,或者在響應返回客戶端之前對其進行后處理。過濾器主要應用于以下場景:
- 請求參數過濾和轉換
- 字符編碼處理
- 身份驗證和授權
- 日志記錄
- 壓縮響應數據
- 緩存控制
核心接口和方法
init(FilterConfig config)
?- 初始化過濾器doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
?- 執行過濾邏輯destroy()
?- 銷毀過濾器
public class CharacterEncodingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}@Overridepublic void destroy() {Filter.super.destroy();}
}
配置方式
過濾器可以通過以下方式配置:
????????1.注解配置(Servlet 3.0+)
使用@WebFilter
注解可以直接在過濾器類上配置過濾器,無需在 web.xml 中配置。別忘了在 Spring Boot 應用主類上添加@ServletComponentScan
注解以啟用 Servlet 組件掃描:
package com.cni23.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/*** urlPatterns 匹配所有請求,/*攔截所有請求,可以填寫具體請求路徑*/
@WebFilter(urlPatterns = "/*",filterName = "CharacterEncodingFilter")
public class CharacterEncodingFilter implements Filter {private String encoding;/*** 初始化過濾器*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {String encoding = filterConfig.getInitParameter("encoding");if (encoding == null){encoding = "UTF-8";}}/*** 執行過濾器邏輯*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//獲取請求HttpServletRequest request =(HttpServletRequest) servletRequest;request.setCharacterEncoding(encoding);servletResponse.setCharacterEncoding(encoding);servletResponse.setContentType("text/html;charset=utf-8");//filterChain:鏈//放行,繼續執行下一個過濾器,如果沒有過濾器,則執行目標資源filterChain.doFilter(servletRequest,servletResponse);}/*** 銷毀過濾器*/@Overridepublic void destroy() {}
}
????????2.web.xml 配置(傳統方式)
<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>com.cni23.filter.CharacterEncodingFilter</filter-class></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
????????3.Java 代碼配置(Spring 等框架中常用,)
1)編寫過濾規則
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Enumeration;public class RequestLoggingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化邏輯}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;// 記錄請求信息System.out.println("Request URL: " + httpRequest.getRequestURL());System.out.println("Method: " + httpRequest.getMethod());// 記錄請求頭Enumeration<String> headerNames = httpRequest.getHeaderNames();while (headerNames.hasMoreElements()) {String headerName = headerNames.nextElement();System.out.println(headerName + ": " + httpRequest.getHeader(headerName));}// 繼續請求處理鏈chain.doFilter(request, response);}@Overridepublic void destroy() {// 清理資源}
}
2)配置我們的過濾器
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<RequestLoggingFilter> loggingFilter() {FilterRegistrationBean<RequestLoggingFilter> registrationBean = new FilterRegistrationBean<>();// 設置過濾器實例registrationBean.setFilter(new RequestLoggingFilter());// 設置過濾器應用的URL模式registrationBean.addUrlPatterns("/api/*", "/secure/*");// 設置過濾器名稱registrationBean.setName("requestLoggingFilter");// 設置過濾器執行順序(值越小,優先級越高)registrationBean.setOrder(1);// 添加初始化參數registrationBean.addInitParameter("enabled", "true");return registrationBean;}
}
配置方式對比
-
注解配置
- 優點:簡潔、直觀,與代碼在一起,便于維護
- 缺點:不夠靈活,URL 模式等配置與代碼耦合
-
web.xml 配置
- 優點:集中管理,配置與代碼分離,適合復雜場景
- 缺點:XML 文件可能變得龐大復雜,難以維護
-
Java 代碼配置
- 優點:完全的編程控制,可以使用 Spring 的依賴注入
- 缺點:需要了解 Spring 框架,配置相對復雜
具體使用哪一個可以根據自己的項目來決定。