Spring Boot 中过滤器Filter、拦截器Interceptor使用

Filter

Sping Boot中有两种方式创建Filter

方式1:

@Component
public class Filter1 extends OncePerRequestFilter

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Autowired
    private Filter1 filter1;

    @Bean
    public FilterRegistrationBean myOncePerRequestFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(filter1);
        registration.addUrlPatterns("/*");
        registration.setName("filter1");
        // order数值小的先执行
        registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return registration;
    }
}

方式2:

@WebFilter("/*")
public class Filter2 extends OncePerRequestFilter

@ServletComponentScan
public class Application

方式2最终还是生成了bean:FilterRegistrationBean

执行顺序order问题:

使用“方式2”的情况下,order默认是优先级最低的,通过添加@Order注释以及实现Ordered、PriorityOrdered接口,均不可行,因为最后被包装为FilterRegistrationBean,而order是通过FilterRegistrationBean .setOrder(Ordered.HIGHEST_PRECEDENCE);设置的。

所以如果想设置order顺序,需要使用“方式1”进行配置。


Interceptor

@Component
public class Interceptor1 implements HandlerInterceptor

@Component
public class Interceptor2 implements HandlerInterceptor

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private Interceptor1 interceptor1;

    @Autowired
    private Interceptor2 interceptor2;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // order数值小的先执行
        registry.addInterceptor(interceptor1).order(1).addPathPatterns("/**");
        registry.addInterceptor(interceptor2).order(2).addPathPatterns("/**");
    }
}

Filter、Interceptor的区别

Filter是Java Servlet规范中定义的,可以拦截所有的http请求,如果你的项目中不只是使用了SpringMvc,还集成了Jersey,想要统一过滤,使用Filter。

Interceptor是SpringMvc中定义的,只能拦截SpringMvc的请求,优点是可以拿到Handler,如下:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    logger.info("Interceptor1 preHandle");
    boolean isHandlerMethod = handler instanceof HandlerMethod;
    if (!isHandlerMethod){
            return true;
    }
    {
        Method method = ((HandlerMethod) handler).getMethod();
        // 这边可以做很多事情
        // 例如:拿到f方法上的注释,根据注释再做逻辑处理。
    }

    return true;
}

如果有这种需求,使用Interceptor。

你可能感兴趣的:(Java,Spring,Boot)