问题背景:
1、早期的软件产品,使用 spring mvc
2、jsp form 表单中要传附件,同时有 input 字段要提交,因此表单 encType 必须是 multipart/form-data, action="POST"
问题:
1、按照流转很广的方式 ,新建 XssFilterServletRequestWrapper extends HttpServletRequestWrapper, XssFilter 中 dofilter 方法中 HttpServletRequest req = (HttpServletRequest) request; 对 ServletRequest 参数进行强制类型转换,然后
XssFilterServletRequestWrapper wrapper = new XssFilterServletRequestWrapper(req);
chain.doFilter(wrapper, response);
结果, XssFilterServletRequestWrapper 中的 getParameter getParameterValues 方法中取不到表单中的 参数值
原因: multipart/form-data 提交到 servlet 的数据格式不是 key/value 格式,是流的格式,所以 getParameter 取不到值
解决:
1、可以用smartupload 解析 form 提交的流数据
2、高级一点的,用 spring 造好的轮子 MultipartHttpServletRequest 接口来处理,MultipartHttpServletRequest 继续了 javax.servlet.http.HttpServletRequest 接口 和 org.springframework.web.multipart.MultipartRequest 接口,关键代码如下:
HttpServletRequest req = (HttpServletRequest) request;
MultipartHttpServletRequest multiReq = multipartResolver.resolveMultipart(req);
XssFilterServletRequestWrapper wrapper = new XssFilterServletRequestWrapper(multiReq);
chain.doFilter(wrapper, response);