需求:
我需要在一个拦截器或过滤器中读取request中的body,并进行一些校验操作,校验完成之后,交给后续的控制器继续使用。
遇到的问题:
后续的控制器无法继续使用,因为文件流只能读取一次,在拦截器或过滤器中读取了request中的body后,无法在控制器重复读取。
解决方案:
利用mark和reset进行有限制的重复读取。
public static String readBodyNoClose(HttpServletRequest request) {
String param = "";
try {
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
br.mark(1*1024*1024);// 最大缓存1g
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
param = sb.toString();
if (br.markSupported()) {
br.reset();//跳至mark
}
} catch (Exception e) {
e.printStackTrace();
}
return param;
}