我有Interceptor,并且由于某些原因,我必须阅读HttpServletRequest
中包含的POSTED日期,如下所示:
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("");
}
在执行此操作后,我收到了400个针对Ajax的错误请求
无法读取HTTP消息:
org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing
最佳答案
Spring提供了一个名为ContentCachingRequestWrapper
的类,该类扩展了HttpServletRequestWrapper
。此类缓存从中读取的所有内容
getInputStream()
和getReader()
并允许通过getContentAsByteArray()
检索此内容。因此,我们可以为此目的多次检索InputStream
。该方法由ContentCachingRequestWrapper
中的blow提供:
@Override
public ServletInputStream getInputStream() throws IOException {
if (this.inputStream == null) {
this.inputStream = new ContentCachingInputStream(getRequest().getInputStream());
}
return this.inputStream;
}
此类使用以下方法解决了
UTF-8
的字符编码问题:@Override
public String getCharacterEncoding() {
String enc = super.getCharacterEncoding();
return (enc != null ? enc : WebUtils.DEFAULT_CHARACTER_ENCODING);
}
Here是
ContentCachingRequestWrapper
中的完整详细信息。