程序员社区

Spring Boot 自定义 Filter

       在 Spring Boot 之前自定义 Filter 的配置,都是在
webapp/WEB-INF/web.xml 文件下来配置;或者说使用 @WebFilter 注解的方式来配置。在使用 Spring Boot 开发 Web 项目时,并没有 web.xml 配置文件的存在,所以
Spring Boot 为我们提供了两种方式来将我们自定义的 Filter注册到 Spring 容器中。

  1. 使用 @WebFilter 注解方式
  2. 通过 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

赞(0) 打赏
未经允许不得转载:IDEA激活码 » Spring Boot 自定义 Filter

一个分享Java & Python知识的社区