方式一
@Configurationpublic class WebConfiguration {@Beanpublic FilterRegistrationBean<PreFilter> preFilterRegistration() {FilterRegistrationBean<PreFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new PreFilter());//配置过滤路径registration.addUrlPatterns("/*");//设置filter名称registration.setName("preFilter");//请求中过滤器执行的先后顺序,值越小越先执行registration.setOrder(Ordered.HIGHEST_PRECEDENCE);return registration;}@Slf4jpublic static class PreFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {log.info("into PreFilter");filterChain.doFilter(request, response);}}}
方式二
如果过滤器中需要使用到依赖注入,可以使用这个方式
@Configurationpublic class WebConfiguration {@Beanpublic FilterRegistrationBean<DelegatingFilterProxy> preFilterRegistration() {FilterRegistrationBean<DelegatingFilterProxy> registration = new FilterRegistrationBean<>();registration.setFilter(new DelegatingFilterProxy("preFilter"));//配置过滤路径registration.addUrlPatterns("/*");//设置filter名称registration.setName("preFilter");//请求中过滤器执行的先后顺序,值越小越先执行registration.setOrder(Ordered.HIGHEST_PRECEDENCE);return registration;}@Slf4j@Component("preFilter")public static class PreFilter extends OncePerRequestFilter {@Autowiredprivate BizConfig bizConfig;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {log.info("into PreFilter");logger.info(bizConfig.getWebHook());filterChain.doFilter(request, response);}}}
FilterRegistrationBean
spring boot启动时,会加载servlet容器。这时会获取所有实现ServletContextInitializer的类,初始化并注册到ServletContext中。
DelegatingFilterProxy
DelegatingFilterProxy实现Filter,其本身就是一个过滤器,会被注册到Selvlet容器。但过滤器调用的时候,会通过targetBeanName从spring容器中获取真正的执行业务逻辑的过滤器。
DelegatingFilterProxy可以说是一个代理过滤器。
