springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题

来源:互联网 发布:xp保存网络密码 编辑:程序博客网 时间:2024/06/05 10:43
http://blog.csdn.net/qq_22956867/article/details/51437905

springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题


本文 只讲使用不过多阐述原理(因为我也没太深究),希望有熟知原理的朋友不吝分享 下面开始。

------------------------------------------------------------------------------ 无聊的前言  但是还是得说 ------------------------------------------------------------------------------------------------------------------------

前端时间处理上传文件时遇到了一些问题 multipart/form-data 方式提交的请求 在无法用Filter 中用 ServletRequest.getParameter 方法取不到一并提交上来的 参数,网上说 需要使用 ServletRequest.getReader() 方法 来获取请求信息(RequestPayload), 然后在解析字符串来获取想要的参数。 但是! ServletRequest.getReader() 只能获取一次,如果在拦截其中 取出了requestPayload ,那么在spring的 controller 中 你将取不到参数和文件了!!!!!

摸索到了这里我发现这是走了弯路, 既然 springMVC 的接口中可以获取到 参数,那说明 spring 已经很好的解决了这个问题 咱们就不要自己造轮子了;



!!!!!!!!!!干货来了

通过查看mvc的源码 果然 发现了两个类,

1.1.实现了、 ServletRequest的 org.springframework.web.multipart.MultipartHttpServletRequest.Java 类 (这个类的 getParameter 方法可以获取到 multipart/form-data 和 非multipart/form-data 方法上传的  参数)

1.2.用于创建 MultipartHttpServletRequest.java 的 org.sprin

gframework.web.multipart.MultipartResolver.java 类

使用方法



2.1  首先在你的spring配置文件中 配置 MultipartHttpServletRequest

[html] view plain copy
  1. <bean id="multipartResolver"  
  2.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver"  
  3.         p:defaultEncoding="UTF-8">  
  4.         <property name="maxUploadSize">  
  5.             <value>104857600</value>  
  6.         </property>  
  7.         <property name="maxInMemorySize">  
  8.             <value>4096</value>  
  9.         </property>  
  10. </bean>  

2.2 在你的拦截其中 注入 MultipartHttpServletRequest

[java] view plain copy
  1. // 用于创建MultipartHttpServletRequest  
  2. private MultipartResolver multipartResolver = null;  
  3.       
  4. @Override  
  5. public void init(FilterConfig arg0) throws ServletException {  
  6. // 注入bean  
  7.     multipartResolver = ((MultipartResolver)ApplicationContextUtil.getContext().getBean("multipartResolver", MultipartResolver.class));  
  8. }  


2.3 在你的最顶层的 拦截器中 把你的 ServletRequest 替换成 MultipartHttpServletRequest

[java] view plain copy
  1.        /** 
  2.  * 获取 request 
  3.  * @param req 
  4.  * @return 
  5.  */  
  6. private ServletRequest getRequest(ServletRequest req){  
  7.     String enctype = req.getContentType();  
  8.     if (StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data"))  
  9.         // 返回 MultipartHttpServletRequest 用于获取 multipart/form-data 方式提交的请求中 上传的参数  
  10.         return multipartResolver.resolveMultipart((HttpServletRequest) req);  
  11.     else   
  12.         return req;  
  13. }  


2.4 把 用上面 2.3的 getRequest(req) 获取到的 MultipartHttpServletRequest 交给 chain.doFilter(MultipartHttpServletRequest, resp); 让请求继续执行。 之后的所有拦截器和controller都能继续get参数了

2.5  没了

0 0
原创粉丝点击