Servlet API 中提供了一个Filter接口,通过Filter可以实现在访问某个目标资源之前,对访问的请求和响应进行拦截。
SpringBoot项目中可以通过两种方式来实现Filter的配置。首先看下自定义的Filter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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-------"); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| @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类上添加如下注释:
1
| @WebFilter(filterName = "otherFilter")
|
并且,还需要在启动类上添加注释 @ServletComponentScan,以确保能扫描的Filter类,当然也可以指定该注解的basePackages属性。这里需要注意的是,使用这种方式时,不能像第一种方式那样指定filter顺序,使用Order注解也无效。