要拦截首先想到的是拦截器,@RequestBody只能以流的方式读取,流被读过一次后,就不在存在了,会导致会续无法处理,因此不能直接读流

为了解决这个问题,思路如下:

1、读取流前先把流保存一下

2、使用过滤器拦截读取,再通过chain.doFilter(wrapper, response);将保存的流丢到后面程序处理

package com.qmtt.tools;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; /**
*
* @author 流的方式获取JSON数据
*/
public class RequestWrapper extends HttpServletRequestWrapper { // 存放JSON数据主体
private final String body; public RequestWrapper(HttpServletRequest request) throws IOException {
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
body = stringBuilder.toString();
} @Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes("UTF-8"));
ServletInputStream servletInputStream = new ServletInputStream() {
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
} @Override
public boolean isFinished() {
return false;
} @Override
public boolean isReady() {
return false;
} @Override
public void setReadListener(ReadListener listener) { }
};
return servletInputStream;
} @Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
} public String getBody() {
return this.body;
}
}

过滤器写法如下

    @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String path = req.getContextPath();
String method = req.getServletPath();
Map map = request.getParameterMap();
String msg = "";
RequestWrapper wrapper = new RequestWrapper(req);
if (map != null)
msg = JsonUtils.toJsonString(map);
log.info(String.format("请求路径:%s,请求方法%s,请求参数:%s-%s", path, method, msg, wrapper.getBody()));
chain.doFilter(wrapper, response);
}

另一种方法:通过拦截器处理,拦截所有controller的讲求可以实现(目前我用的是拦截器)

最新文章

  1. Pramp mock interview (4th practice): Matrix Spiral Print
  2. 转行IT行业的心路历程2
  3. [iOS 基于CoreBluetooth的蓝牙4.0通讯]
  4. torch7安装
  5. poj: 2255
  6. Android桌面悬浮清内存app概述
  7. visual studio 2010 出现问题,不能设置断点调试了,一运行就未响应,然后程序退出
  8. Lucence
  9. Windows环境部署并调试pyspark(一)
  10. python爬虫入门(五)Selenium模拟用户操作
  11. 使用BeautifulSoup
  12. Oracle创建新undo表空间最佳实践(包含段检查)
  13. BackBone Network
  14. Android 保存图片到相册
  15. CentOS 6.5下RPM方式(重新)安装MySQL 5.7.21从头到尾篇
  16. JMeter 参数化之利用CSV Data Set Config从文件读取参数并关联变量
  17. sigar开发(java)
  18. 记录片宇宙之the secret of the sun
  19. POJ-3635 Full Tank? (记忆化广搜)
  20. Linux 系统安装[Ubuntu]

热门文章

  1. ADB结构及代码分析【转】
  2. 一步一步学Silverlight 2系列(14):数据与通信之WCF
  3. I.MX6 2014 u-boot 测试修改
  4. I.MX6 2G DDR3 16G eMMC
  5. I.MX6 eMMC分区挂载
  6. C++ 下啥时候用struct, 啥时候用class
  7. atof和atoi
  8. Logback中%X的使用
  9. 51nod 1051 最大子矩阵和(DP)
  10. 魔法宝石(邻接表+dfs更新)