今天发现了一个关于ServletRequest.getParameter()方法的一个奇怪之处。
如果form表单的enctype为application/x-www-form-urlencoded(该值是默认值,不需显式声明),那么在过滤器或者Servlet中,我们可以直接通过request.getParameter()来获得相应的参数值;如果form表单的enctype为multipart/form-data时(上传图片需要声明该值),如果没有使用额外的代码去解析输入流,则在过滤器或者Servlet中,调用request.getParameter()将返回null!
Spring MVC 的 HiddenHttpMethodFilter 类通过在doFilterInternal() 方法中调用request.getParameter("_method"),获得被增强的HTTP方法,例如Patch,Delete。然而,若提交的表单的enctype为multipart/form-data,则在 HiddenHttpMethodFilter 的 doFilterInternal() 方法中调用request.getParameter("_method"),将返回null,出现错误。
两种解决方式:
1、若表单的enctype为multipart/form-data,则表单不应包含<input type="hidden" name="_method" />,反之亦然。
2、在请求到达HiddenHttpMethodFilter 之前,解析表单,并对请求进行包装,这样在HiddenHttpMethodFilter 的 doFilterInternal() 方法中调用request.getParameter("_method")将返回正确的值。
补充与此问题相关的类:MultipartFilter