SpringBoot Filter配置

​ 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注解也无效。