springboot中过滤器执行顺序

问题遇到的现象和发生背景

我的项目中有两个过滤器,一个是 GlobalFilter 过滤器(order=-100),一个是WebFilter过滤器(order=-99),现在请求进来的时候,先进入的是WebFilter过滤器,然后进入的是GlobalFilter 过滤器,我觉得是因为两个过滤器类型不一致导致的默认执行顺序不一致,WebFilter过滤器总是优先GlobalFilter 过滤器执行,跟@Order设置多少是没有关系的。

我想要达到的结果

在线求解。如果我想先执行GlobalFilter 过滤器,然后执行WebFilter过滤器我该怎么办?有没有什么办法?求解

你说的WebFilter是指实现了原生servlet filter的过滤器吗?如果是的话,应该是没办法。请求的执行过程,应该是先经过servlet容器中的filter,然后是spring的servlet,然后是gateway中的GlobalFilter和GatewayFilter(GlobalFilter和GatewayFilter的实现,可以通过@Order注解进行排序)

WebFilter就像是一个家的入户门,GlobalFilter 像是这个家里面一个卧室的门;order的值是优先级。
不论优先级多高,想进卧室,一定会通过入户门

通过@Bean的形式注入试试,应该可以保证执行顺序

@Configuration
public class FilterConfig {
 
    @Bean
    public FilterRegistrationBean registrationBean(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        DemoFilter01 demoFilter01 = new DemoFilter01();
        filterRegistrationBean.setFilter(demoFilter01);
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setName("regist01");
        filterRegistrationBean.setOrder(3);
        return filterRegistrationBean;
    }
 
    @Bean
    public FilterRegistrationBean registrationBean2(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        DemoFilter02 demoFilter02 = new DemoFilter02();
        filterRegistrationBean.setFilter(demoFilter02);
        filterRegistrationBean.addUrlPatterns("/demo/test1");
        filterRegistrationBean.setName("regist02");
        filterRegistrationBean.setOrder(2);
        return filterRegistrationBean;
    }
 
    @Bean
    public FilterRegistrationBean registrationBean3(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        DemoFilter03 demoFilter03 = new DemoFilter03();
        filterRegistrationBean.setFilter(demoFilter03);
        filterRegistrationBean.addUrlPatterns("/aaa");
        filterRegistrationBean.setName("regist03");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
 
}

先按类型,再根据order注解设定值,再根据filter名字排序

不要用webfilter,使用配置来配置吧,注册filter的时候给设置order值

springmvc 中如果有多个过滤器,那么过滤器的初始化顺序是web.xml中配置由下到上的
Filter执行顺序
Filter的执行顺序是按照FilterChain来执行的,FilterChain中Filter的顺序不同配置方式下的组织情况不同,具体如下:

基于注解配置:按照类名的字符串比较规则比较,值小的先执行
使用web.xml配置:根据对应的Mapping的顺序组织,谁定义在上边谁就在前

试一下指定顺序,值越小优先级越大。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(WebFilter()).addPathPatterns("/").order(2);
registry.addInterceptor(GlobalFilter()).addPathPatterns("/
").order(1);
}

先看看你的过滤器类型吧

可以自定义过滤器,设置顺序,也就是责任链模式。