這兩天在項目中遇到這樣一種情況,通過過濾器filter獲取參數token去驗證是否登錄,始終獲取不到,一直是null,而通過攔截器(interceptor)可以,百度一番,終於明白其中緣由....
我們只需要理解兩點:
1)一個請求到達過濾器filter時還未經過spring的請求解析,到達攔截器(interceptor)時請求已經經過spring的解析,而spring對multipart/form-data方式請求已做處理;
2)實現了ServletRequest的org.springframework.web.multipart.MultipartHttpServletRequest.java 類 (這個類的getParameter方法可以獲取到multipart/form-data和非multipart/form-data方法上傳的參數。
所以我們得出一下解決方案:
首先在你的spring配置文件中配置MultipartHttpServletRequest
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8"> <property name="maxUploadSize"> <value>104857600</value> </property> <property name="maxInMemorySize"> <value>4096</value> </property> </bean>
或者

然后在filter初始化時注入MultipartResolver
// 用於創建MultipartHttpServletRequest
private MultipartResolver multipartResolver = null;
@Override
public void init(FilterConfig arg0) throws ServletException {
// 注入bean
multipartResolver = ((MultipartResolver)ApplicationContextUtil.getContext().getBean("multipartResolver", MultipartResolver.class));
}
最后在dofilter中
String contentType = req.getContentType();
if (contentType != null && contentType.contains("multipart/form-data")) {
MultipartHttpServletRequest multipartRequest = multipartResolver.resolveMultipart((HttpServletRequest)req);
//在這里可以通過multipartRequest 獲取參數了
// 把multipartRequest讓請求繼續執行,之后的所有攔截器和controller都能繼續get參數
chain.doFilter(multipartRequest , response);
return;
}
