当前位置: 首页 > ai >正文

Springboot注册过滤器的三种方式(Order 排序)

一、使用 @Component + @Order(简单但不够灵活)

适用于全局过滤器,无需手动注册,Spring Boot 会自动扫描并注册。

@Component
@Order(1)  // 数字越小,优先级越高
public class AuthFilter implements Filter {@Autowired  // 依赖注入正常private AuthService authService;@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 认证逻辑chain.doFilter(request, response);}
}

特点:
✅ 简单,无需额外配置
✅ 支持 @Autowired 依赖注入
默认拦截所有请求(/*),无法自定义 URL 匹配规则
❌ 多个过滤器时,@Order 顺序可能不够直观


二、使用 @WebFilter + @ServletComponentScan

适用于需要指定 URL 匹配规则的过滤器,但仍依赖 @Order 控制顺序。

@WebFilter(urlPatterns = "/api/*")  // 仅拦截 /api/*
@Order(2)  // 设置顺序
public class LoggingFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("请求进入 LoggingFilter");chain.doFilter(request, response);}
}

启动类需添加 @ServletComponentScan

@SpringBootApplication
@ServletComponentScan  // 扫描 @WebFilter
public class MyApp {public static void main(String[] args) {SpringApplication.run(MyApp.class, args);}
}

特点:
✅ 可自定义 URL 匹配规则
不支持 @Autowired 依赖注入(因为 @WebFilter 由 Servlet 容器管理,而非 Spring)
❌ 顺序控制仍依赖 @Order


三、 使用 FilterRegistrationBean(最灵活,推荐方式)

适用于需要精确控制 URL 匹配和顺序的场景,但需注意依赖注入问题。

@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<MyFilter> myFilterRegistration() {FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new MyFilter());  // ⚠️问题:直接 new 导致依赖注入失效registration.addUrlPatterns("/admin/*");registration.setOrder(1);  // 明确指定顺序return registration;}
}

问题:
MyFilter 中的 @Autowired 依赖全部为 null

原因:
new MyFilter() 创建的实例不受 Spring 容器管理,导致 @Autowired 失效。


解决 FilterRegistrationBean 依赖注入问题

通过构造函数注入 Filter 实例:让 Spring 管理 MyFilter 的实例,再传给 FilterRegistrationBean

@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean<MyFilter> myFilterRegistration(MyFilter myFilter) {  // 注入 MyFilterFilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>();registration.setFilter(myFilter);  // 使用 Spring 管理的 Beanregistration.addUrlPatterns("/admin/*");registration.setOrder(1);return registration;}
}@Component  // 必须加 @Component 或 @Service
public class MyFilter implements Filter {@Autowired  // 现在可以正常注入private AdminService adminService;@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 使用 adminServicechain.doFilter(request, response);}
}

优点:
✔️ 依赖注入正常
✔️ 支持精确控制 URL 和顺序


总结对比

注册方式依赖注入URL 匹配顺序控制适用场景
@Component + @Order✅ 支持❌ 默认 /*@Order全局过滤器
@WebFilter + @ServletComponentScan❌ 不支持✅ 自定义@Order简单 URL 过滤
FilterRegistrationBean(直接 new❌ 不支持✅ 自定义setOrder()❌ 不推荐
FilterRegistrationBean(注入 Bean)✅ 支持✅ 自定义setOrder()✅ 推荐方式

最佳实践建议

  1. 优先使用 FilterRegistrationBean + 构造函数注入(解决方案1),兼顾灵活性和依赖注入。
  2. 如果只是全局过滤器,可以用 @Component + @Order
  3. 避免直接 new Filter(),否则 @Autowired 会失效。
http://www.xdnf.cn/news/17605.html

相关文章:

  • Spring Cloud系列—Config配置中心
  • 【Oracle APEX开发小技巧16】交互式网格操作内容根据是否启用进行隐藏/展示
  • VS4210芯片技术资料(IT6604+VS4210+MDIN380连接原理图)
  • 基于STC8单片机的RTC时钟实现:从原理到实践
  • 如何使股指期货套期保值效果更加精准?
  • Ansible部署应用
  • AR巡检:三大核心技术保障数据准确性
  • 聚合搜索中的设计模式
  • 【Unity】Unity中ContentSizeFitter有时无法及时自适应大小问题解决
  • Baumer高防护相机如何通过YoloV8深度学习模型实现木板表面缺陷的检测识别(C#代码UI界面版)
  • python --- 基础语法(1)
  • Web 开发 14
  • [SC]如何使用sc_semaphore实现对共享资源的访问控制
  • 【网络运维】Linux和自动化:Ansible
  • 基于RAII的智能指针原理和模拟实现智能指针
  • 企业培训笔记:宠物信息管理--实现宠物信息的添加
  • NLP—词向量转换评论学习项目分析
  • 【Java项目与数据库、Maven的关系详解】
  • Docker部署kafka实操+Java中访问
  • 42.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成认证(一)
  • 云计算概述
  • 【web站点安全开发】任务2:HTML5核心特性与元素详解
  • GitLab CI + Docker 自动构建前端项目并部署 — 完整流程文档
  • 跨界重构规则方法论
  • TCP服务器网络编程设计流程详解
  • Linux Ansible的安装与基本使用
  • Linux:企业级WEB应用服务器TOMCAT
  • 技术干货|Kafka 如何实现零停机迁移
  • Stereolabs ZED相机 选型指南:双目 / 单目、短距 / 长距,如何为机器人视觉系统匹配最优方案?
  • selenium常见的与浏览器版本不兼容闪退问题