Springboot Filter顺序配置

https://www.jianshu.com/p/ba4ee395dce0

两种配置方法

第一种

1.在Filter类上加@WebFilter;

  1. Springboot入口Class上加@ServletComponentScan(basePackages = {"filter所在包名"})
    多个Filter都这样配置,只要这些Filter之间没有先后依赖关系。
    我这里刚好有两个Filter有先后顺序要求,看到除了@WebFilter注解还有@Order这个注解。
    Springboot官方文档没有细说这个Order注解。经测试程序在本地是好的,部署到远程顺序就不能保证了。没有深纠是什么原因,知道还有第二种配置方法。

第二种方式

这种配置能保证Filter的执行先后顺序
在启动类添加FilterRegistrationBean,如下

@SpringBootApplication
public class DovApplication {

    public static void main(String[] args) {
        SpringApplication.run(DovApplication.class, args);
    }

    //第一个Filter注册
    ...

    @Bean
    public FilterRegistrationBean<RequireLoginFilter> registerLoginCheckFilter(RequireLoginFilter requireLoginFilter) {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(requireLoginFilter);
        registrationBean.addUrlPatterns("/*");
        registrationBean.setName("loginCheckFilter");
        registrationBean.setOrder(2);
        return registrationBean;
    }
}
@Component
public class RequireLoginFilter extends OncePerRequestFilter {

    private static List<String> loginNotRequiredUrls = new ArrayList<>();

    static {
        loginNotRequiredUrls.add("/images/**");
        loginNotRequiredUrls.add("/");
        loginNotRequiredUrls.add("/login");
    }

    @Autowired
    private SessionCache sessionCache;

    private PathMatcher pathMatcher = new AntPathMatcher();
    ... //省略

RequireLoginFilter用普通的@Component标记,它本身用到的依赖autowire进去即可。
经测试第二种配置Filter的Order是能保证的,order值越小,Filter越早经过。

 

0人点赞

 

日记本

 



作者:持证程序员
链接:https://www.jianshu.com/p/ba4ee395dce0
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Spring Boot Filter是一个用于拦截HTTP请求的处理链,它可以在请求进入业务处理器之前或之后添加自定义的行为。Filter通常用于处理如统一的请求日志、跨站请求伪造(CSRF)防护、权限验证等常见的场景。以下是Spring Boot中正确使用Filter的一般步骤: 1. 配置过滤器:在`WebMvcConfigurer`接口或配置类中添加`addFilter()`方法,指定Filter顺序和实现类。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFilters(FilterRegistrationBean[] filters) { // 添加全局filter filters.add(new FilterRegistrationBean<>(new MyGlobalFilter()) .addUrlPatterns("/*") .order(0)); // 或者添加特定路径的filter FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyPathSpecificFilter()); registration.addUrlPatterns("/api/**"); registration.order(1); filters.add(registration); } } ``` 2. 创建Filter实现类:覆写`doFilter()`方法,这里可以访问到HttpServletRequest、HttpServletResponse和FilterChain对象。 ```java @Component public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; // 这里进行自定义操作... chain.doFilter(request, response); } // 其他可能需要的方法,如 init() 和 destroy() } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello_world!

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值