手机版网站的优势,珠海企业网站推广服务,呢图网站,精品课程 网站建设质量背景
在一次业务开发中#xff0c;由于需要在拦截器中对一个http请求中request body内容做解析和判断#xff0c;所以用了httpServletRequest的getInputStream解析了request body内容#xff0c;之后导致了拦截器处理成功后#xff0c;原来的业务接口处报request body not…背景
在一次业务开发中由于需要在拦截器中对一个http请求中request body内容做解析和判断所以用了httpServletRequest的getInputStream解析了request body内容之后导致了拦截器处理成功后原来的业务接口处报request body not found的错误。 原理
在使用Springboot开发restful接口的时候RequestBody将request body内容注入到参数里时内部是调用getInputStream方法。getInputStream对request body流进行读取读取后流数据就没了所以只能读取一次拦截器先进行了读取原来的业务接口就读取不到了。 解决方案
创建一个类BodyReaderHttpServletRequestWrapper继承HttpServletRequestWrapper重写getInputStream和getReader方法在request.getInputStream之后保存请求体之后业务代码就可以重复读request body了。
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.springframework.util.StreamUtils;
/**
*
* 从请求体中获取参数请求包装类br
* author nick
* version 5.0 since 2018年9月5日
*/
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper{
private byte[] requestBody null;//用于将流保存下来
public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
requestBody StreamUtils.copyToByteArray(request.getInputStream());
}
Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais new ByteArrayInputStream(requestBody);
return new ServletInputStream() {
Override
public int read() throws IOException {
return bais.read();
}
Override
public boolean isFinished() {
return false;
}
Override
public boolean isReady() {
return false;
}
Override
public void setReadListener(ReadListener readListener) {
}
};
}
Override
public BufferedReader getReader() throws IOException{
return new BufferedReader(new InputStreamReader(getInputStream()));
}
}