chain.doFilter(req, resp)

Posted 孙猴子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了chain.doFilter(req, resp)相关的知识,希望对你有一定的参考价值。

web中的Filiter过滤器:

  当req不改变时,filiter在web中的配置和顺序没有关系;

  但当在filiter中将其改变类型时,会导致其改变的request类型包装层次过多,无法获取其中的参数;

  例:http://www.cnblogs.com/springlight/p/6208908.html

 

  上例中在下面代码中改变了request类型

  MultipartHttpServletRequest multiReq = multipartResolver.resolveMultipart(httpReq);

 

  而在web.xml中,改变request类型的过滤器之后,还有另一个过滤器,使得request重新包装,多层嵌套其中

  <filter-mapping>
    <filter-name>requestFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>  

   <filter-mapping>  
     <filter-name>XssSqlFilter</filter-name>  <!--此过滤器中重新包装了request,影响了在controller层参数值的获取-->
      <url-pattern>/*</url-pattern>  
   </filter-mapping>

 

  这就导致多次的包装

  chain.doFilter(req, resp);

 

  在controller层就无法按照原有的方式去获取参数值,如下:

        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        if(WebUtil.isEmpty((CommonsMultipartFile) multipartRequest.getFile("file"))){//此处无法获取文件
            json.put("message", "没有文件");
            return json.toString();
        }

 

 

   解决方案:

  调转web.xml中过滤器的申明顺序即可,如下:

<filter-mapping>  
     <filter-name>XssSqlFilter</filter-name>  
     <url-pattern>/*</url-pattern>  
   </filter-mapping>
  <filter-mapping>
        <filter-name>requestFilter</filter-name>
         <url-pattern>/*</url-pattern>
  </filter-mapping>

 

  感想:

   此时得到正确的结果,激动的不能自已。

以上是关于chain.doFilter(req, resp)的主要内容,如果未能解决你的问题,请参考以下文章

Servlet过滤器重定向:如何在chain.doFilter(request,resp)之后重定向;

Spring之声明式事务

servlet中filter和chain有啥用?

Java filter中的chain.doFilter详解

java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序

为啥 Tuckey UrlRewrite Filter 在规则匹配后不调用chain.doFilter?