spring mvc自定义过滤器filter实现对request预处理和response响应

      过滤器的作用拦截请求,提取公用的代码,在请求访问action之前先处理一段代码,在action处理之后,在处理一段代码;基于这样的作用,我们就可以在请求访问action之前先处理一些整个项目共用的代码片段,比如,域名,,请求的url信息,以及基于域名拓展的自定义信息,比如用户数据等等基础数据,获取到这些基础数据之后,将这些数据保存在请求的上下文,这样在所有action请求就可以通用;

spring为我们提供很多基础的过滤器接口,比如GenericFilterBean,Filter ,OncePerRequestFilter等等,这里我使用了基于GenericFilterBean自定义自己的过滤器,实现抽象方法doFilter,在该方法中实现自己的业务代码即可 其他过滤器用法类似,可以参考其他的资料;代码如下:

      接口入参包括了request,response以及过滤器调用链chain;前面两个参数大家比较常见,重点介绍过滤器链chain;

      正常一个web项目中会配置多个的filter,这些filter的执行顺序是按照web.xml配置的顺序执行,这些filter形成一个filter过滤器链,chain.doFilter负责将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源;重点就在这,如果你没在每个filter的doFilter方法中调用chain.doFilter的方法,那么,就会造成请求走到这个filter之后,接下去的filter以及请求的真正资源都不会执行到,也就是请求没响应,或者404等问题;所以,切记,一定要调用chain.doFilter方法!!!!

      在doFiter方法中,我们就可以根据request提取一些公用参数信息,然后将这些参数存到当前线程的上下文中,可以参考:ThreadLocal,一个很好的多线程传参工具;

写好过滤器之后,就要将该过滤器配置到项目的web.xml中,代码如下:

其中:filter-name指定过滤器名;

          filter-class:过滤器的类;

          filter-mapping:映射的配置;

          url-pattern:拦截的路径;

       如果过滤器需要一些初始参数,则可以使用init-param配置参数值,在这里,我的过滤器就有一个参数为name的参数,所以这里我使用param-name指定参数名为name的参数,使用param-value设定参数值为contextFilter11111111;

       为了验证过滤器执行的顺序,我配置了两个过滤器,顺序为contextFilter->testFilter,接下来,看下执行结果如图:

先执行contextFilter过滤器,在执行testFilter,也可以看到输出参数name为我们配置的值:contextFilter111111111;说明配置没问题;读者可以验证在web.xml调整两个过滤器的位置,看下执行结果是不是先执行testFilter,再执行contextFilter;

 

  

 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值