本文目录:
在 Spring Boot 之前自定义 Filter 的配置,都是在
webapp/WEB-INF/web.xml
文件下来配置;或者说使用 @WebFilter 注解的方式来配置。在使用 Spring Boot 开发 Web 项目时,并没有 web.xml 配置文件的存在,所以
Spring Boot 为我们提供了两种方式来将我们自定义的 Filter注册到 Spring 容器
中。
- 使用 @WebFilter 注解方式
- 通过 FilterRegistrationBean类的方式
1.使用 @WebFilter 注解方式
1.1 自定义 MyFilter 类
自定义一个 MyFilter 类,添加注解@WebFilter,通过 value/urlPattern 属性来指定映射的 URL。
/** * TODO 自定义Filter * * @author liuzebiao * @Date 2020-4-2 15:27 */
//@WebFilter(value = {"/myTest","/filter"},filterName="myFilter")
//指定vlaue属性 和 urlPattern属性均可以
@WebFilter(urlPatterns = {
"/myFilter","/filter"},filterName="MyFilter")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init 方法");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("开始执行 Filter");
//获取URL请求参数
Enumeration enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String paraName = (String) enu.nextElement();
System.out.println(paraName + ": " + request.getParameter(paraName));
}
//执行过滤器
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("destroy 方法");
}
}
1.2 添加 @ServletComponentScan 注解
在Spring Boot 启动类上,添加一个 @ServletComponentScan 注解
@ServletComponentScan
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(BootApplication.class,args);
}
}
2.编写FilterRegistrationBean类的方式
2.1 同样先自定义一个 MyFilter(代码同1.1中 MyFilter,唯一区别是不需要加@WebFilter注解)
/** * TODO 自定义Filter * * @author liuzebiao * @Date 2020-4-2 15:27 */
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init 方法");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("开始执行 Filter");
//获取URL请求参数
Enumeration enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String paraName = (String) enu.nextElement();
System.out.println(paraName + ": " + request.getParameter(paraName));
}
//执行过滤器
chain.doFilter(request, response);
}
@Override
public void destroy() {
System.out.println("destroy 方法");
}
}
2.2 添加 Spring Boot 配置类,将自定义的 MyServlet 注册到容器中
@Configuration
public class MyServerConfig {
//注册Filter组件
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());
filterRegistrationBean.setUrlPatterns(Arrays.asList("/myFilter","/filter"));
return filterRegistrationBean;
}
}
当我们访问 /myFilter
请求时,便会执行到我们自定义的 MyFilter中。Filter URL映射地址,接收可变参数,支持同时配置多个 URL 地址。如下所示:
@Bean
public FilterRegistrationBean myFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new MyFilter());
filterRegistrationBean.setUrlPatterns(Arrays.asList("/myTest","/filter"));
return filterRegistrationBean;
}
@WebFilter(urlPatterns = {
"/myFilter","/filter"},filterName="myFilter")
public class MyFilter implements Filter {
}
Spring Boot 自定义 Filter,介绍到此为止
如果本文对你有所帮助,那就给我点个赞呗
End