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

    xiaoxiao2022-06-27  182

    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。


    最新回复(0)