在拦截器中如果直接读取inputstream获取数据,会导致接口读取参数时参数为空,因为inputstream已经被读完,如何解决
时间: 2024-02-21 13:59:14 浏览: 111
在拦截器中读取inputstream获取数据会导致接口读取参数时参数为空的问题,是因为inputstream只能被读取一次,读取后就被清空了。为了避免这个问题,可以在拦截器中读取完inputstream后将其保存到request的attribute中,在接口中再将其读取出来使用。具体做法如下:
1. 在拦截器中读取inputstream并将其保存到request的attribute中。例如:
```
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
StringBuilder sb = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
String jsonStr = sb.toString();
// 将jsonStr保存到request的attribute中
request.setAttribute("jsonData", jsonStr);
return true;
}
}
```
2. 在接口中从request的attribute中读取json数据。例如:
```
@PostMapping("/api/test")
public Result test(HttpServletRequest request) {
String jsonStr = (String) request.getAttribute("jsonData");
// 将jsonStr转换为Java对象并进行相应的处理
return Result.success();
}
```
通过将inputstream保存到request的attribute中,可以避免拦截器中读取inputstream导致接口中读取参数为空的问题。需要注意的是,在将json数据保存到request的attribute中时,需要确保attribute的名称不会和其他参数或attribute冲突。
阅读全文