方式一
@Configuration
public class WebConfiguration {
@Bean
public 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;
}
@Slf4j
public static class PreFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
log.info("into PreFilter");
filterChain.doFilter(request, response);
}
}
}
方式二
如果过滤器中需要使用到依赖注入,可以使用这个方式
@Configuration
public class WebConfiguration {
@Bean
public 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 {
@Autowired
private BizConfig bizConfig;
@Override
protected 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可以说是一个代理过滤器。