问题: 要实现一个spring拦截器需要读取request数据流,但是request数据流只能读取一次,需要自己实现HttpServletRequestWrapper对数据流包装,实现如下:
public class ReadHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final byte[] cachedBytes;
public ReadHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(request.getInputStream(), baos);
this.cachedBytes = baos.toByteArray();
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(cachedBytes);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
};
}
@Override
public BufferedReader getReader() throws IOException{
return new BufferedReader(new InputStreamReader(getInputStream()));
}
}
拦截器的实现:(这里不贴代码了,mock下)
public class WrapperHandlerInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

本文讨论了在Spring拦截器中遇到的HttpServletRequest数据流只能读取一次的问题,以及如何通过HttpServletRequestWrapper来处理。内容涉及POST请求、Content-Type为application/x-www-form-urlencoded的表单数据处理,解释了getInputStream()和getParameter()的互斥性,并提供了解决方案。
最低0.47元/天 解锁文章
1530





