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

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

sring为我们提供很多基础的过滤器接口,比如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;


  


猜你喜欢

转载自blog.csdn.net/LLF_1241352445/article/details/81054473
今日推荐