zoukankan      html  css  js  c++  java
  • Spring Boot 使用 Filter

    Filter 是 JavaEE 中 Servlet 规范的一个组件,位于包javax.servlet 中,它可以在 HTTP 请求到达 Servlet 之前,被一个或多个Filter处理。 

    1. 编写Filter

    要编写 Filter ,只需要实现javax.servlet.Filter接口就可以了。

    public class MyFilter implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("MyFilter");
            // 要继续处理请求,必须添加 filterChain.doFilter()
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    Filter 接口有三个方法:init(),doFilter(),destroy()

    其中doFilter()需要自己实现,其余两个是default的,可以不用实现。

    注意:如果Filter要使请求继续被处理,就一定要调用filterChain.doFilter()!

    2. 配置Filter被 Spring 管理

    1. 使用@Component+@Order

    在刚刚定义的MyFilter类上加上@Component和@Order注解,即可被Spring管理

    @Component
    @Order(1)
    public class MyFilter implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("MyFilter");
            // 要继续处理请求,必须添加 filterChain.doFilter()
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    当有多个Filter时,这里的@Order(1)注解会指定执行顺序,数字越小,越优先执行,如果只写@Order,默认顺序值是Integer.MAX_VALUE

    @Component + @Order 注解方式配置简单,支持自定义 Filter 顺序。缺点是只能拦截所有URL,不能通过配置去拦截指定的 URL。

     

    2.@WebFilter+@ServletComponentScan

    在 MyFilter上添加@WebFilter注解,并在启动类上增加@ServletComponentScan("com.zhengxl.filterdemo.filter")注解,参数就是Filter所在的包路径,相当于告诉 SpringBoot,去哪里扫描 Filter

    @WebFilter(urlPatterns = "/*")
    public class MyFilter implements Filter {
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            System.out.println("MyFilter");
            // 要继续处理请求,必须添加 filterChain.doFilter()
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

     

    @SpringBootApplication
    @ServletComponentScan("com.zhengxl.filterdemo.filter")
    public class FilterDemoApplication {

        public static void main(String[] args) {
            SpringApplication.run(FilterDemoApplication.class, args);
        }

    }

    @WebFilter+@ServletComponentScan 注解方式支持对 Filter 匹配指定URL,但是不支持指定 Filter 的执行顺序。

     

    3. JavaConfig 配置方式

    @Configuration
    public class FilterConfig {
        @Bean
        public FilterRegistrationBean registerMyFilter(){
            FilterRegistrationBean<MyFilter> bean = new FilterRegistrationBean<>();
            bean.setOrder(1);
            bean.setFilter(new MyFilter());
            // 匹配"/hello/"下面的所有url
            bean.addUrlPatterns("/hello/*");
            return bean;
        }
        @Bean
        public FilterRegistrationBean registerMyAnotherFilter(){
            FilterRegistrationBean<MyAnotherFilter> bean = new FilterRegistrationBean<>();
            bean.setOrder(2);
            bean.setFilter(new MyAnotherFilter());
            // 匹配所有url
            bean.addUrlPatterns("/*");
            return bean;
        }
    }

  • 相关阅读:
    201671010417 金振兴 词频统计软件项目报告
    201671010417 金振兴 实验三 作业互评与改进
    读构建之法提出的问题
    201671010422 结对项目报告
    201671010422 马亮 实验三作业互评与改进报告
    实验十四 个人学习总结
    201671010422 词频统计软件项目报告
    201671010423马丽莎 《英文文本统计分析》结对项目报告
    201671010423 词频统计软件项目报告
    201671010423马丽莎 实验三作业互评与改进报告
  • 原文地址:https://www.cnblogs.com/KL2016/p/15272485.html
Copyright © 2011-2022 走看看