SpringBoot之过滤器Filter

Filter简介

Filter也称之为过滤器,它是Servlet技术中最激动人心的技术之一,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet, 静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。


Filter实现

  • 继承Filter接口
@Component
@WebFilter(filterName="过滤器名称", urlPatterns = "/*") //过滤地址
public class TimeFilter implements Filter {
    private Logger logger = Logger.getLogger(this.getClass());

    /**
     * 容器启动时初始化init
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("==============TimeFilter初始化====================");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        logger.info("==============进入doFilter====================");
        long l = System.currentTimeMillis();
        filterChain.doFilter(servletRequest, servletResponse);
        logger.info("==============退出doFilter====================耗时:" + (System.currentTimeMillis() - l));
    }

    @Override
    public void destroy() {
        logger.info("==============TimeFilter销毁====================");
    }
}

实际继承Filter接口,添加@Component,@WebFilter后一个过滤器就已经实现了。

  • init(FilterConfig filterConfig):容器启动时就执行此方法,FilterConfig 有什么属性呢?
String getFilterName();//得到filter的名称。 
String getInitParameter(String name);//返回在部署描述中指定名称的初始化参数的值。如果不存在返回null. 
Enumeration getInitParameterNames();//返回过滤器的所有初始化参数的名字的枚举集合。 
public ServletContext getServletContext();//返回Servlet上下文对象的引用。
  • doFilter:这是过滤器核心方法,客户端请求我们接口时,先执行filterChain.doFilter(servletRequest, servletResponse);前面的方法,当执行到filterChain.doFilter方法时,会到相应请求接口(或下一个过滤器),接口返回后,会跳到filterChain.doFilter后面的代码。
  • destroy():容器销毁后执行此方法,主要进行一些清除操作。

    注册bean方法实现

    上面实现是通过@Component,@WebFilter方法实现的,在springBoot中可以以注册bean的方法(不写那两个注解)实现

@Configuration
public class TimeFilerConfig {
    /**
     * 注册自定义TimeFilter的bean
     */
    @Bean(name = "timeFilter")
    public FilterRegistrationBean timeFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        Filter timeFilter = new TimeFilter();
        filterRegistrationBean.setFilter(timeFilter);
        //设置拦截路径
        ArrayList<String> urls = new ArrayList<>();
        urls.add("/*");
        filterRegistrationBean.setUrlPatterns(urls);
        //如果多个Filter,指定Filter的顺序,数字越小越先开始
        filterRegistrationBean.setOrder(10);
        return filterRegistrationBean;
    }
   }

FilterRegistrationBean 还有其它的属性设值方式,自行查找资料。

如果注册多个Filter如何实现?

@Configuration
public class TimeFilerConfig {
    /**
     * 注册自定义TimeFilter的bean
     */
    @Bean(name = "timeFilter")
    public FilterRegistrationBean timeFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        Filter timeFilter = new TimeFilter();
        filterRegistrationBean.setFilter(timeFilter);
        //设置拦截路径
        ArrayList<String> urls = new ArrayList<>();
        urls.add("/*");
        filterRegistrationBean.setUrlPatterns(urls);
        //如果多个Filter,指定Filter的顺序,数字越小越先开始
        filterRegistrationBean.setOrder(10);
        return filterRegistrationBean;
    }

    /**
     * 注册自定义timeTwoFilter的bean
     */
    @Bean(name = "timeTwoFilter")
    public FilterRegistrationBean timeTwoFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        Filter timeFilter = new TimeTwoFilter();
        filterRegistrationBean.setFilter(timeFilter);
        //设置拦截路径
        ArrayList<String> urls = new ArrayList<>();
        urls.add("/*");
        filterRegistrationBean.setUrlPatterns(urls);
        //如果多个Filter,指定Filter的顺序
        filterRegistrationBean.setOrder(5);
        return filterRegistrationBean;
    }
}

执行流程

单个Filter

这里写图片描述

多个Filter

这里写图片描述

应用

请参考我的另一篇博客:springBoot之过滤器解决前端跨域问题


拦截器和过滤器区别参考:http://blog.csdn.net/Kincym/article/details/78920918

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值