zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    lua继承3
    C 调试
    lua继承
    hdoj_1102Constructing Roads(最小生成树)&& poj_2485Highways
    网络摄像头监控
    hdoj_3336Count the string(KMP)
    逻辑思维训练500题(带答案)
    AC自动机算法
    poj_3080Blue Jeans && poj_3450Corporate Identity(KMP)
    hdoj_1162Eddy's picture(最小生成树)
  • 原文地址:https://www.cnblogs.com/myitnews/p/12346777.html
Copyright © 2011-2022 走看看