springmvc的参数接收不能兼容以及HttpServletRequest中的流多次使用

简介: springmvc的参数接收不能兼容以及HttpServletRequest中的流多次使用

web开发中的POST请求很常见,最近遇到的一个问题是写接口,我看别人牛逼的接口都是又能浏览器访问,又能JS访问,又能URL getUrl = new URL(url);URLConnection connection = getUrl.openConnection();访问,

而我在用springmvc的时候利用他请求参数自动封装的用法,怎么样都不能兼容JS和后台请求接口两种用法,也是百度谷歌半天无果,最后我看我java发起的post请求,写法如下:

OutputStream out = conn.getOutputStream();
out.write((jsonObj.toString()).getBytes("UTF-8"));

这就是输出流,对于服务端来说就是要接收这个输出流啊,springmvc的什么表单或者json参数自动封装成对象,或者各种接收参数的注解,其实都是封装HttpServletRequest中的流。

既然这样,那就不用springmvc的自动封装了,自己封装。

BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream) request.getInputStream(), "utf-8"));
StringBuffer sb = new StringBuffer("");
String temp;
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
br.close();

这样就能获取到HttpServletRequest中的post数据了,sb.toString(),一般是json格式,至于json格式想得到对应类型的数据就很随意了。

这里要注意的是:在正常开发中,HttpServletRequest这个参数需要经过多个过滤器,而无法保证在哪个过滤器的操作中被读取了一次流的操作,只能读取一次,读取了一次后面从过滤器到达controller的时候再获取是null的。

那么解决这个问题的办法也有多个,这里说一个算是比较简单的做法

1、创建类:ThreadCache

public class ThreadCache {

// ThreadLocal里只存储了简单的String对象,也可以自己定义对象,存储更加复杂的参数
private static ThreadLocal threadLocal = new ThreadLocal();

public static String getPostRequestParams() {
return threadLocal.get();
}

public static void setPostRequestParams(String postRequestParams) {
threadLocal.set(postRequestParams);
}

public static void removePostRequestParams() {
threadLocal.remove();
}
}

2、在过滤器中将以上读取流的代码进行改造一下

if ("POST".equals(req.getMethod().toUpperCase())) {
BufferedReader br = new BufferedReader(new InputStreamReader(
(ServletInputStream) request.getInputStream(), "utf-8"));
StringBuffer sb = new StringBuffer("");
String temp;
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
br.close();
//将流放在线程里面,在controller中需要重复利用,如果不这样controller中request带的post数据将会丢失
ThreadCache.setPostRequestParams(sb.toString());
}

3、到请求最终需要参数的地方获取参数,比如springmvc中的controller里面

String requestStr =  ThreadCache.getPostRequestParams();

requestStr 就是请求的json参数。

目录
相关文章
|
存储 前端开发 Java
SpringMVC中重定向请求时传输参数原理分析与实践
SpringMVC中重定向请求时传输参数原理分析与实践
202 2
SpringMVC中重定向请求时传输参数原理分析与实践
47SpringMVC - 参数绑定(绑定包装pojo)
47SpringMVC - 参数绑定(绑定包装pojo)
35 0
|
应用服务中间件 数据库
46SpringMVC - 参数绑定(绑定pojo类型)
46SpringMVC - 参数绑定(绑定pojo类型)
80 0
45SpringMVC - 参数绑定(绑定简单类型)
45SpringMVC - 参数绑定(绑定简单类型)
60 0
|
19天前
|
前端开发 Java UED
SpringMVC全局异常处理+拦截器使用+参数校验
通过使用 SpringMVC 的全局异常处理、拦截器和参数校验,可以有效提升 Web 应用程序的安全性、稳定性和用户体验。这些技术的合理应用,不仅可以保证代码的健壮性,还能提高代码的可维护性,为开发高质量的 Web 应用程序提供了坚实的基础。
32 6
|
Java Spring
SpringMVC中请求传输的各种类型参数分析
SpringMVC中请求传输的各种类型参数分析
63 0
|
7月前
|
JSON 前端开发 JavaScript
JAVAEE框架技术之5-springMVC参数绑定和异步交互
JAVAEE框架技术之5-springMVC参数绑定和异步交互
82 0
JAVAEE框架技术之5-springMVC参数绑定和异步交互
|
JavaScript
springMVC接收数组参数
springMVC接收数组参数
43SpringMVC - 参数绑定(默认支持的参数类型)
43SpringMVC - 参数绑定(默认支持的参数类型)
55 0
|
JSON 前端开发 数据格式
SpringMVC学习笔记(获取参数,传递参数——关于前后端传参交互的总结、from表单、Ajax数据提交))(下)
SpringMVC学习笔记(获取参数,传递参数——关于前后端传参交互的总结、from表单、Ajax数据提交))(下)
121 0