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”进行配置。
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。