Servlet API 中提供了一个Filter接口,通过Filter可以实现在访问某个目标资源之前,对访问的请求和响应进行拦截。
SpringBoot项目中可以通过两种方式来实现Filter的配置。首先看下自定义的Filter:
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("-----UserFilter init-------");
System.out.println(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("-----UserFilter doFilter-------");
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("----- UserFilter destroy-------");
}
}
public class OtherFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("-----OtherFilter init-------");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("-----OtherFilter doFilter-------");
// Filter 只是链式处理,请求依然转发到目的地址
// 如果不想请求向下走可以不继续调用doFilter
chain.doFilter(request,response);
}
@Override
public void destroy() {
System.out.println("----- OtherFilter destroy-------");
}
}
第一种方式,使用FilterRegistrationBean:
@Configuration
public class FilterConfiguration {
@Bean
public FilterRegistrationBean userFilternBean() {
UserFilter userFilter = new UserFilter();
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setName("userFilter"); // 过滤器名称
registrationBean.setFilter(userFilter); // 注入过滤器
registrationBean.setOrder(0); //过滤器顺序
registrationBean.setUrlPatterns(Arrays.asList("/*")); //拦截规则
return registrationBean;
}
@Bean
public FilterRegistrationBean helloFilterRegistrationBean() {
OtherFilter otherFilter = new OtherFilter();
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setName("otherFilter");
registrationBean.setFilter(otherFilter);
registrationBean.setOrder(1);
// 没有配置setUrlPatterns,则是全部拦截
return registrationBean;
}
}
第二种方式,使用注解:
在自定义filter类上添加如下注释:
@WebFilter(filterName = "otherFilter")
并且,还需要在启动类上添加注释 @ServletComponentScan
,以确保能扫描的Filter类,当然也可以指定该注解的basePackages属性。这里需要注意的是,使用这种方式时,不能像第一种方式那样指定filter顺序,使用Order注解也无效。