|
找到问题了。原来是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>
--> |
|
|