出现这个问题的原因:
首先请求体传递是使用字节流的方式,那也就意味着只能获取一次,在拦截器中获取后,接口就获取不到了,就会报错400;
解决方案:封装HttpServletRequestWrapper,通过过滤器提前获取请求体,存储在封装的对象中
上代码:
package ;
import ;
import .slf4j.Slf4j;
import org.;
import org.;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/***
* @author mazaiting
* @date 2019-06-27
* @decription HttpServletRequest 包装器
* 解决: ()只能读取一次的问题
* 目标: 流可重复读
*/
@Slf4j
public class RequestWrapper extends HttpServletRequestWrapper {
/**
* 日志
*/
private static final Logger mLogger = ();
/**
* 请求体
*/
private String mBody;
public RequestWrapper(HttpServletRequest request) {
super(request);
// 将body数据存储起来
mBody = getBody(request);
}
/**
* 获取请求体
* @param request 请求
* @return 请求体
*/
private String getBody(HttpServletRequest request) {
try {
byte[] bodyBytes = (());
return new String(bodyBytes, ());
} catch (IOException e) {
(());
throw new RuntimeException(e);
}
}
/**
* 获取请求体
* @return 请求体
*/
public String getBody() {
return mBody;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
// 创建字节数组输入流
final ByteArrayInputStream bais = new ByteArrayInputStream((()));
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return ();
}
};
}
}
package ;
import ;
import ;
import .*;
import ;
import ;
import ;
@Component
@WebFilter(filterName = "HttpServletRequestFilter", urlPatterns = "/")
@Order(10000)
public class HttpServletRequestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String contentType = ();
String method = "multipart/form-data";
if (contentType != null && (method)) {
// 将转化后的 request 放入过滤链中
request = new StandardServletMultipartResolver().resolveMultipart(request);
}
request = new RequestWrapper((HttpServletRequest) servletRequest);
//获取请求中的流如何,将取出来的字符串,再次转换成流,然后把它放入到新request对象中
// 在方法中传递新的request对象
if(null == request) {
(servletRequest, servletResponse);
} else {
(request, servletResponse);
}
}
@Override
public void destroy() {
}
}
//拦截器中获取方式
String body = new RequestWrapper(request).getBody();
问题解决!!!