JAVA EE 过滤器
在 Spring Boot 中,使用过滤器(Filter)可以让你在请求和响应处理流程中插入自定义逻辑。过滤器在 Spring Boot 中通常用于处理跨域请求、记录请求日志、进行身份验证、请求参数处理等。
下面是如何在 Spring Boot 中使用过滤器的步骤和示例。
1. 创建一个自定义过滤器
一个过滤器需要实现 javax.servlet.Filter
接口,并重写 doFilter()
方法。
示例代码:
package com.example.demo.filter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import org.springframework.stereotype.Component;
@Component
public class MyCustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 过滤器初始化(可选)
System.out.println("MyCustomFilter initialized!");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 过滤器的核心逻辑
System.out.println("Request is being filtered...");
// 执行请求的下一步(即传递给下一个过滤器或目标资源)
chain.doFilter(request, response);
// 响应返回时的处理
System.out.println("Response is being filtered...");
}
@Override
public void destroy() {
// 过滤器销毁(可选)
System.out.println("MyCustomFilter destroyed!");
}
}
说明:
init()
方法:在过滤器初始化时调用(可选)。doFilter()
方法:处理过滤器的核心逻辑,可以在此处进行请求的预处理,或者响应的后处理。chain.doFilter()
调用将请求传递到下一个过滤器或目标资源。destroy()
方法:过滤器销毁时调用(可选)。
2. 注册过滤器
Spring Boot 自动扫描所有标注为 @Component
的类,因此如果你的过滤器类加上了 @Component
注解,它会被自动注册为 Spring Bean,并被应用到整个应用程序中。@Component
可以省略,下面的方式也能注册。
通过 FilterRegistrationBean
显式注册过滤器(更灵活)
如果你想控制过滤器的顺序或仅对某些 URL 路径生效,可以通过 FilterRegistrationBean
来显式注册过滤器。
package com.example.demo.config;
import com.example.demo.filter.MyCustomFilter;
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<MyCustomFilter> loggingFilter() {
FilterRegistrationBean<MyCustomFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new MyCustomFilter());
registrationBean.addUrlPatterns("/api/*"); // 仅对 /api/* 路径的请求生效
registrationBean.setOrder(1); // 设置过滤器的执行顺序,数字越小,优先级越高
return registrationBean;
}
}
配置说明:
setFilter()
:指定要注册的过滤器。addUrlPatterns()
:指定过滤器要应用的 URL 路径(支持通配符)。setOrder()
:设置过滤器的执行顺序。顺序较小的过滤器优先执行,顺序较大的过滤器后执行。
3. 实现跨域请求处理(CORS)
package com.example.demo.filter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
import org.springframework.stereotype.Component;
@Component
public class CORSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化过滤器
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 设置CORS头信息
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
response.setHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, Authorization");
// 继续执行请求
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 销毁时的逻辑
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具