springMvc 完美解决 multipart/form-data 方式提交请求 在 Filter 中 ServletRequest.getParameter方法 获取不到参数的问题
2016-05-17 17:34
1466 查看
本文 只讲使用不过多阐述原理(因为我也没太深究),希望有熟知原理的朋友不吝分享 下面开始。
------------------------------------------------------------------------------ 无聊的前言 但是还是得说 ------------------------------------------------------------------------------------------------------------------------
前端时间处理上传文件时遇到了一些问题 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.springframework.web.multipart.MultipartResolver.java 类
使用方法
2.1 首先在你的spring配置文件中 配置 MultipartHttpServletRequest
2.2 在你的拦截其中 注入 MultipartHttpServletRequest
2.3 在你的最顶层的 拦截器中 把你的 ServletRequest 替换成 MultipartHttpServletRequest
2.4 把 用上面 2.3的 getRequest(req) 获取到的 MultipartHttpServletRequest 交给 chain.doFilter(MultipartHttpServletRequest, resp); 让请求继续执行。 之后的所有拦截器和controller都能继续get参数了
2.5 没了
------------------------------------------------------------------------------ 无聊的前言 但是还是得说 ------------------------------------------------------------------------------------------------------------------------
前端时间处理上传文件时遇到了一些问题 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.springframework.web.multipart.MultipartResolver.java 类
使用方法
2.1 首先在你的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>
2.2 在你的拦截其中 注入 MultipartHttpServletRequest
// 用于创建MultipartHttpServletRequest private MultipartResolver multipartResolver = null; @Override public void init(FilterConfig arg0) throws ServletException { // 注入bean multipartResolver = ((MultipartResolver)ApplicationContextUtil.getContext().getBean("multipartResolver", MultipartResolver.class)); }
2.3 在你的最顶层的 拦截器中 把你的 ServletRequest 替换成 MultipartHttpServletRequest
/** * 获取 request * @param req * @return */ private ServletRequest getRequest(ServletRequest req){ String enctype = req.getContentType(); if (StringUtils.isNotBlank(enctype) && enctype.contains("multipart/form-data")) // 返回 MultipartHttpServletRequest 用于获取 multipart/form-data 方式提交的请求中 上传的参数 return multipartResolver.resolveMultipart((HttpServletRequest) req); else return req; }
2.4 把 用上面 2.3的 getRequest(req) 获取到的 MultipartHttpServletRequest 交给 chain.doFilter(MultipartHttpServletRequest, resp); 让请求继续执行。 之后的所有拦截器和controller都能继续get参数了
2.5 没了
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- jQuery plugin items filter
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序