springboot中过滤器配置使用

文章目录

前置介绍

你使用

  • java
  • springboot

过滤器 filter 用在请求到达 controller 之前或者响应返回给用户之前

往往可以用 filter 来做请求的修改,日志、权限、跨域等场景,例如:设置编码和字符集,请求头,状态码等

过滤器是在请求进入容器后,但请求进入 servlet 之前进行预处理的,请求结束返回也是,是在 servlet 处理完后,返回给前端之前

拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不行,在拦截器里注入一个 service,可以调用业务逻辑。而过滤器是 JavaEE 标准,只需依赖 servlet api ,不需要依赖 spring

Filter 是依赖于 Servlet 容器,属于 Servlet 规范的一部分,Filter 的生命周期由 Servlet 容器管理

filter 代码

doFilter 方法中做过滤的逻辑

java 复制代码
public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化时执行的代码
        System.out.println("FirstFilter initialized");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 在请求到达 Controller 之前执行的
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        System.out.println("Request URL: " + httpRequest.getRequestURL());

        // 执行后续的过滤器或 Controller
        chain.doFilter(request, response);

        // 在响应返回客户端之前执行的代码
        System.out.println("Response processed");
    }

    @Override
    public void destroy() {
        // 销毁时执行的代码
        System.out.println("FirstFilter destroyed");
    }
}

注册 filter

下面两个方法都可以

方法一:@WebFilter注解(Servlet 3.0+)

如果你的项目支持 Servlet 3.0 及以上版本,可以直接在 Filter 类上使用 @WebFilter 注解

java 复制代码
@WebFilter(urlPatterns = "/api/*")
public class FirstFilter implements Filter {
	// ...
}

在 Spring Boot 启动类上添加 @ServletComponentScan,使 @WebFilter 生效

java 复制代码
@SpringBootApplication
@ServletComponentScan // 扫描@WebFilter注解

那怎么知道自己是不是 servlet 3.0 以及以上版本?

Spring Boot 的版本和嵌入的 Tomcat 版本决定了默认使用的 Servlet API 版本

  • Spring Boot 2.x 对应 Tomcat 9.x,支持 Servlet 4.0。
  • Spring Boot 3.x 对应 Tomcat 10.x,支持 Servlet 5.0(Jakarta EE)
    你还可以查找使用的 javax.servlet-api 依赖是哪个版本的

方法二:通过配置 configuration 和 bean 注册

java 复制代码
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<FirstFilter> FirstFilter() {
        FilterRegistrationBean<FirstFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new FirstFilter());
        registrationBean.addUrlPatterns("/api/*"); // 指定过滤器的URL模式
        return registrationBean;
    }
}

疑问

过滤器的执行顺序?

如果你只使用 FilterRegistrationBean 显示注册 filter,则使用如下方法指定优先级

java 复制代码
registrationBean.setOrder(1);

如果你是多个 filter 使用 @WebFilter 注解,它们的执行顺序由类名的字母顺序决定(在 @WebFilter 注解中添加 @Order 注解(如 @Order(1))不会生效。因为 @Order 是 Spring 的注解,而 @WebFilter 是 Servlet 原生注解,Spring 不会自动将其顺序应用到 Servlet 容器中)

你可以结合 @WebFilter 和 FilterRegistrationBean 使用,即 FilterRegistrationBean 再覆盖顺序,需要使用其 setOrder

如果需要精确控制顺序,推荐完全使用 FilterRegistrationBean 注册过滤器(无需 @WebFilter)

相关推荐
9ilk7 分钟前
【基于one-loop-per-thread的高并发服务器】--- 项目介绍&&模块划分
运维·服务器·c++·后端·中间件
SimonKing9 分钟前
Spring Boot还能这样玩?同时监听多个端口的黑科技
java·后端·程序员
日月星辰Ace11 分钟前
JDK 工具学习系列(三):javadoc 命令实用教程
java
青梅主码25 分钟前
CB Insights最新发布《2025年Q3全球AI状态》:融资交易单笔规模暴增86% AI初创融资像过山车 代理AI成香饽饽
后端
亚林瓜子31 分钟前
SpringBoot中使用tess4j进行OCR(在macos上面开发)
java·spring boot·macos·ocr·lstm·tess4j
CoovallyAIHub39 分钟前
Cursor 2.0 太离谱了!8 个 AI 同时写代码,还能自己测!
css·后端·程序员
狂团商城小师妹1 小时前
JAVA国际版同城打车源码同城服务线下结账系统源码适配PAD支持Android+IOS+H5
android·java·ios·小程序·交友
m0_736927041 小时前
Java面试场景题及答案总结(2025版持续更新)
java·开发语言·后端·职场和发展
间彧1 小时前
jps命令和其他Java监控工具(jcmd、jinfo等)有什么区别和联系?
后端
何中应1 小时前
IDEA实用快捷键
java·ide·intellij-idea