`

SpringMVC上传问题(resin下无法上传)

阅读更多

找到问题了。原来是Fiter的问题,如果一个请求是Multipart请求,Spring就会自动调用MultipartResolver,
然后将 HttpServletRequest请求变为MultipartHttpServletRequest请求

然而问题出现在以下Filter[
com.duowan.lobbystat.admin.interceptor.AdminFilter
com.duowan.common.log.filter.ProfilerLoggerFilter
com.duowan.common.web.filter.xss.XSSFilter
com.duowan.lobbystat.admin.interceptor.CacheFilter
]
 
String reportName = request.getParameter("reportName");
String cacheKey = path + "?" + request.getQueryString() ;
XssUtil.checkXSS(request.getParameterMap());
.....以下操作,会将请求转换为GET请求,从而丢失以multipart/form-data的形式发送的数据。

经过实际证明。我comment了这些Filter,程序能正常运行。所以
如果写过滤器通过request get回参数时,需要加以下判断


 public static final String MULTIPART = "multipart/";

 

 public void doFilter(ServletRequest sRequest, ServletResponse sResponse, FilterChain filterChain) throws IOException, ServletException {
  bizLog.debug(" -------------- 进入权限过滤器 ----------------- ");
  HttpServletRequest  request = (HttpServletRequest) sRequest;
  HttpServletResponse  response = (HttpServletResponse) sResponse;
  
  if(isMultipartContent(request)) {
   filterChain.doFilter(request, response);
   return;
  }

 

}

 

 /**
* Part of HTTP content type header.
*/

 public static final boolean isMultipartContent(
            HttpServletRequest request) {
        if (!"post".equals(request.getMethod().toLowerCase())) {
            return false;
        }
        String contentType = request.getContentType();
        if (contentType == null) {
            return false;
        }
        if (contentType.toLowerCase().startsWith(MULTIPART)) {
            return true;
        }
        return false;
    }


所以。请相关的人员更新一些过滤器代码

注意:要是web.xml里有spring自带的过滤器,请注释,该过滤器也会把MultipartHttpServletRequest转成get请求,

从而丢失以multipart/form-data的形式发送的数据:

 

<!-- 浏览器不支持put,delete等method,由该filter将_method=delete转换为标准的http delete方法 -->
<!--
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<servlet-name>springmvc</servlet-name>
</filter-mapping>
-->

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics