Springboot Filter顺序配置

两种配置方法

第一种

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越早经过。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容