方式一

  1. @Configuration
  2. public class WebConfiguration {
  3. @Bean
  4. public FilterRegistrationBean<PreFilter> preFilterRegistration() {
  5. FilterRegistrationBean<PreFilter> registration = new FilterRegistrationBean<>();
  6. registration.setFilter(new PreFilter());
  7. //配置过滤路径
  8. registration.addUrlPatterns("/*");
  9. //设置filter名称
  10. registration.setName("preFilter");
  11. //请求中过滤器执行的先后顺序,值越小越先执行
  12. registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
  13. return registration;
  14. }
  15. @Slf4j
  16. public static class PreFilter extends OncePerRequestFilter {
  17. @Override
  18. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
  19. log.info("into PreFilter");
  20. filterChain.doFilter(request, response);
  21. }
  22. }
  23. }

方式二

如果过滤器中需要使用到依赖注入,可以使用这个方式

  1. @Configuration
  2. public class WebConfiguration {
  3. @Bean
  4. public FilterRegistrationBean<DelegatingFilterProxy> preFilterRegistration() {
  5. FilterRegistrationBean<DelegatingFilterProxy> registration = new FilterRegistrationBean<>();
  6. registration.setFilter(new DelegatingFilterProxy("preFilter"));
  7. //配置过滤路径
  8. registration.addUrlPatterns("/*");
  9. //设置filter名称
  10. registration.setName("preFilter");
  11. //请求中过滤器执行的先后顺序,值越小越先执行
  12. registration.setOrder(Ordered.HIGHEST_PRECEDENCE);
  13. return registration;
  14. }
  15. @Slf4j
  16. @Component("preFilter")
  17. public static class PreFilter extends OncePerRequestFilter {
  18. @Autowired
  19. private BizConfig bizConfig;
  20. @Override
  21. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
  22. log.info("into PreFilter");
  23. logger.info(bizConfig.getWebHook());
  24. filterChain.doFilter(request, response);
  25. }
  26. }
  27. }

FilterRegistrationBean

spring boot启动时,会加载servlet容器。这时会获取所有实现ServletContextInitializer的类,初始化并注册到ServletContext中。

DelegatingFilterProxy

DelegatingFilterProxy实现Filter,其本身就是一个过滤器,会被注册到Selvlet容器。但过滤器调用的时候,会通过targetBeanName从spring容器中获取真正的执行业务逻辑的过滤器。

DelegatingFilterProxy可以说是一个代理过滤器。