SpringBoot 拦截器中校验Json数据
背景
做开发的时候,经常会使用@RequestBody注解,这个注解是非常的好用。但是如果你想在请求参数传到后台的
时候做一个参数检验,当然可以!使用SpringMVC的拦截器,在拦截器里把request的数据读取出来不就行
了!!,但是在使用了拦截器的时候会出现一个问题!!!!你在拦截器读取了request的数据,在Controller里
面@RequestBody注解获取Json就会失败就读取不到数据!!!!那就是RequestBody是流的形式读取的,流读
取一次就没有了!!
为什么使用RequestBody只能读取一遍请求数据流?
那是因为流对应的是数据,数据放在内存中,有的是部分放在内存中。read 一次标记一次当前位置(mark
position),第二次read就从标记位置继续读(从内存中copy)数据。 所以这就是为什么读了一次第二次是空
了。 怎么让它不为空呢?只要inputstream 中的pos 变成0就可以重写读取当前内存中的数据。javaAPI中有一个
方法public void reset() 这个方法就是可以重置pos为起始位置,但是不是所有的IO读取流都可以调用该方法!
ServletInputStream是不能调用reset方法,这就导致了只能调用一次getInputStream()。
案例:在SpringBoot中校验json值
如果controller类中使用的是json值,需要在拦截器中进行值校验,就必须使用request将值从拿到。
但是使用request.getParameter()是无法获取json数据的。
从request中取出json的工具类
使用下面的工具类,可以将request中的json数据取出:
package cn.rayfoo.common.util.json;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
* @author [email protected]
* @version 1.0
*
将http请求中的request数据转换为json
* @date 2020/8/6 19:02
*/
public class GetRequestJsonUtil {
public static JSONObject getRequestJsonObject(HttpServletRequest request) throws IOException {
String json = getRequestJsonString(request);
return JSONObject.parseObject(json);
}
/***
* 获取 request 中 json 字符串的内容
*
* @param request
* &