SpringBoot使用过滤器的方式和传统xml配置方式不一样,传统方式是写一个继承Filter的自定义Filter,然后在web.xml中配置映射和类型信息,这样容器就能自动构建过滤流程了。SpringBoot没有使用xml配置的方式,过滤器的使用提供了两种方式,一种是注解,一种是构建FilterRegistrationBean方式。SpringBoot在配置上倾向于使用Java代码代替xml配置,所以很多配置只需要构建出相应的Bean即可完成配置,通常搭配只用的是@Configuration和@Bean注解,所以我们有必要了解这两个注解的作用:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
String value() default "";
}
可以看出@Configuration具备@Component的作用,所以使用包扫描的时候注意,另外@Configuration还有声明其是配置的作用,随后还会将其中被@Bean修饰的方法的返回值加入到IOC中,所以这两个注解往往是一起出现使用的。下面就是用Java方式配置Filter的实例:
@Configuration
public class FilterBeanConfig {
/**
*
* @return
*/
@Bean
public FilterRegistrationBean logFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new LogFilter());
List<String> urlList = new ArrayList<String>();
urlList.add("*");
filterRegistrationBean.setUrlPatterns(urlList);
return filterRegistrationBean;
}
}
public class LogFilter implements Filter {
private Logger logger = LoggerFactory.getLogger(LogFilter.class);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
logger.info("Request--coming");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
有一点还需要说明,过滤器和拦截器的调用时机,过滤器的调用时机很早,Web容器如Tomcat在接收到了request后,就会由Filter来处理,随后是相应的Servlet处理,接着才是Interceptor处理,最后交给Controller处理,这当中其实还有一个过程,就是错误的处理,Servlet在处理的时候就能发现请求的合法性,所以这一步会有错误处理,并不是所有的请求都能到Interceptor这里,这个时候就依赖框架的错误处理机制了,如springboot在发现不合法请求时就会转发到/error这个地址,而且处理/error的流程就没走Filter这一层,可以通过打印相关日志证实,另外需要说明的一点是,这里的Servlet已经不是做业务逻辑处理的,很早以前Servlet编程流行的时候是,现在的Servlet多是派发器或是控制器之类的功能了。所以可以看出Interceptor和Controller通常会一起处理request,内部转发请求时不会经过Filter。