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;
        }
    }

  • 相关阅读:
    需要登陆网站后才能获取数据的页面爬取
    PTA中提交Python3程序的一些套路
    PAT 甲级 1014 Waiting in Line (30 分)(queue的使用,模拟题,有个大坑)
    PAT 甲级 1013 Battle Over Cities (25 分)(图的遍历,统计强连通分量个数,bfs,一遍就ac啦)
    PAT 甲级 1012 The Best Rank (25 分)(结构体排序)
    anconda + python 3.6安装(以前的anconda,anaconda和python版本对应关系)
    数学建模python matlab 编程(喷泉模拟)
    数学建模python matlab 编程(疾病传播模型)
    scikit-learn机器学习(四)使用决策树做分类,并画出决策树,随机森林对比
    scikit-learn机器学习(四)使用决策树做分类
  • 原文地址:https://www.cnblogs.com/KL2016/p/15272485.html
Copyright © 2011-2022 走看看