概述
Java 过滤器是 Java EE (Jakarta EE) 中的一种组件,用于在请求到达 Servlet 或 JSP 之前对其进行预处理,或者在响应返回客户端之前对其进行后处理。过滤器主要应用于以下场景:
- 请求参数过滤和转换
- 字符编码处理
- 身份验证和授权
- 日志记录
- 压缩响应数据
- 缓存控制
核心接口和方法
init(FilterConfig config)
- 初始化过滤器doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
- 执行过滤逻辑destroy()
- 销毁过滤器
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public 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;
/**
* 初始化过滤器
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String encoding = filterConfig.getInitParameter("encoding");
if (encoding == null){
encoding = "UTF-8";
}
}
/**
* 执行过滤器逻辑
*/
@Override
public 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);
}
/**
* 销毁过滤器
*/
@Override
public 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 {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化逻辑
}
@Override
public 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);
}
@Override
public 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 {
@Bean
public 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 框架,配置相对复杂
具体使用哪一个可以根据自己的项目来决定。