SpringBoot整合Filter

在传统的web开发时,我们创建一个Filter,需要在web.xml里做配置:

<filter>
    <filter-name>FirstFilter</filter-name>
    <filter-class>com.linhw.demo.filter.MyFirstFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>FirstFilter</filter-name>
    <url-pattern>/filter</url-pattern>
</filter-mapping>

样每新增一个Filter类都要在web.xml增加一段类似的配置,很繁琐,降低了开发的效率。

SpringBoot提供了两种方式来解决这个问题:

  • 通过注解扫描完成 Filter 组件的注册
  • 通过方法完成 Filter 组件的注册

引入依赖:

<!-- 核心启动器, 包括auto-configuration、logging and YAML -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- building web, including RESTful, applications using Spring MVC.
    使用Tomcat作为嵌入式容器, @RestController由这个starter提供-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

一、通过注解扫描完成 Filter 组件的注册

@WebFilter(filterName="FirstFilter", urlPatterns={"/filter"})
public class MyFirstFilter implements Filter{

    /**
     * web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取配置信息,完成对象的初始化功能,
     * 从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。
     * 开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    /**
     * 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,
     * Servlet容器将先调用过滤器的doFilter方法。
     * FilterChain用户访问后续过滤器。
     */
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        System.out.println("MyFirstFilter 进入......");
        arg2.doFilter(arg0, arg1);
        System.out.println("MyFirstFilter 离开......");
    }

    /**
     * Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。
     */
    @Override
    public void destroy() {
        
    }

}

@WebFilter注解的属性详解:

  • filterName:类型String,指定过滤器的name属性,等价于<filter-name>。
  • value:类型String[],等价于urlPatterns属性,但是两者不应该同时使用。
  • urlPatterns:类型String[],指定一组过滤器的URL匹配模式。等价于<url-pattern>标签。
  • servletNames:类型Stirng[],指定过滤器将应用于哪些Servlet。取值是@WebServlet中的name属性的取值,或者是web.xml中<servlet-name>的取值。
  • dispatcherTypes:类型DispatcherType,指定过滤器的转发模式
  • initParams:类型WebInitParam[],指定一组过滤器的初始化参数,等价于<init-param>标签。
  • asyncSupported:类型boolean,声明过滤器是否支持异步操作模式,等价于<async-supported>。
  • description:类型String,过滤器的描述信息,等价于<description>标签。
  • displayName:类型String,过滤器的显示名,通常配合工具使用,等价于<display-name>标签。

用注解的方式必须在SpringBoot启动类增加@ServletComponentScan注解,这样SpringBoot 启动时会扫描@WebFilter,实例化这些类。

二、通过方法完成 Filter 组件的注册

/**
 * 区别于第一种方式,没有使用注解
 */
public class MySecondFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }

    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        System.out.println("SecondFilter 进入......");
        arg2.doFilter(arg0, arg1);
        System.out.println("SecondFilter 离开......");
    }
    
    @Override
    public void destroy() {
        
    }
}

这种方式需要在配置类上以@Bean的形式注入到Spring容器中。

@Configuration
public class BootConfig {

    /**
     * 使用@Bean注解将名为"getFilter"的bean加入到容器
     */
    @Bean
    public FilterRegistrationBean getFilter(){
        FilterRegistrationBean secondFilter = new FilterRegistrationBean(new MySecondFilter());
        secondFilter.addUrlPatterns(new String[]{"/filter"});
        return secondFilter;
    }
}

 

posted @ 2020-02-22 19:32  codedot  阅读(399)  评论(0编辑  收藏  举报