Spring Boot 过滤器拦截 HTTP 请求,并可以自定义操作修改请求和响应,很多情况下我们需要获取 POST 请求传递的 JSON 参数,下面我们就来介绍一下如何获取 POST 请求的 JSON 参数。
1.获取 POST 请求的 JSON 参数
我们可以通过 request.getInputStream() 获取 POST 请求的 inputstream,然后读取 inputstream 输入流可以得到请求参数,但通过这种方式获取请求参数会严重破坏请求流程,所以我们要采用一种优雅的方式获取请求参数。Spring Boot 提供了一个 ContentCachingRequestWrapper 包装类,该类继承了 HttpServletRequestWrapper,可以重写其中的 getInputStream 方法。
具体实例如下:
@Component
public class CustomFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request);
filterChain.doFilter(requestWrapper, servletResponse);
String requestBody = new String(requestWrapper.getContentAsByteArray(), requestWrapper.getCharacterEncoding());
JSONObject jsonParam = JSONObject.parseObject(requestBody);
//TODO:自定义操作
}
}
在这个例子里,CustomFilter 继承了 Filter 接口,实现了自定义拦截器功能。doFilter 拦截请求,通过 ContentCachingRequestWrapper 读取请求体,并在其中完成 JSON 字符串的解析以及自定义操作。这样就完美的实现了获取 POST 请求的参数。
2.获取 POST 请求的 JSON 参数-示例2
以Spring Boot为例,使用@RequestBody解析json文本,示例代码如下
@PostMapping(value = "/jsonTest")
@ResponseBody
public Object jsonTest(HttpServletRequest request, @RequestBody JSONObject jsonParam) {
LOGGER.info("获取的参数为:" + jsonParam.toJSONString());
//TODO:自定义操作
}
在这个例子里,我们的控制器方法参数中使用了 @RequestBody 注解,将 POST 请求的 JSON 数据绑定到换传的参数 jsonParam 中,这种方式就非常自然而且优雅,是更为推荐的一种方式。
细节问题:
如果使用getInputStream()方法读取请求参数,则不支持二次读取,如果流被关闭后再次获取会报错,所以只能选择一种读取方式读取请求参数
以上是 Spring Boot 获取 POST 请求的 JSON 参数的完整攻略,通过这种方式可以优雅地获取 POST 请求的 JSON 参数并且进行操作,另外需要注意的是这种方法只在 POST 请求方式中适用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot过滤器如何获取POST请求的JSON参数 - Python技术站