zoukankan      html  css  js  c++  java
  • 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>

      感想:

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

  • 相关阅读:
    MySQL客户端执行外部sql文件命令
    Java nextInt()函数
    JSP
    托管和非托管的区别。
    FTP软件Filezilla出现“读取目录列表失败”的解决办法
    Fiddler 抓包工具总结
    wampserver:Could not execute menu item.
    重装系统怎么恢复wampserver数据
    同时安装Xcode6和Xcode7导致出现N多UUID 模拟器解决办法
    打印沙漏
  • 原文地址:https://www.cnblogs.com/springlight/p/6227307.html
Copyright © 2011-2022 走看看