Kim*_*Kim 16 java spring spring-mvc
我正在尝试解决某些RequestMapping方法的某些参数,从请求体中提取值并验证它们并将它们注入到某些带注释的参数中.
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 1, get corresponding input parameter from NativeWebRequest
// 2, validate
// 3, type convertion and assemble value to return
return null;
}
Run Code Online (Sandbox Code Playgroud)
最大的问题是我发现HttpServletRequest(get from NativeWebRequest)无法读取输入流(某些参数在请求体中)不止一次.那么我怎样才能多次检索Inputstream/ Reader或请求体?
Ali*_*ani 24
您可以添加过滤器,拦截当前HttpServletRequest并将其包装在自定义中HttpServletRequestWrapper.在您的自定义中HttpServletRequestWrapper,您读取请求正文并对其进行缓存,然后实现getInputStream并getReader从缓存值中读取.由于在包装请求后,缓存的值始终存在,您可以多次读取请求正文:
@Component
public class CachingRequestBodyFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest currentRequest = (HttpServletRequest) servletRequest;
MultipleReadHttpRequest wrappedRequest = new MultipleReadHttpRequest(currentRequest);
chain.doFilter(wrappedRequest, servletResponse);
}
}
Run Code Online (Sandbox Code Playgroud)
在此过滤器之后,每个人都将看到wrappedRequest哪些具有多次读取的能力:
public class MultipleReadHttpRequest extends HttpServletRequestWrapper {
private ByteArrayOutputStream cachedContent;
public MultipleReadHttpRequest(HttpServletRequest request) throws IOException {
// Read the request body and populate the cachedContent
}
@Override
public ServletInputStream getInputStream() throws IOException {
// Create input stream from cachedContent
// and return it
}
@Override
public BufferedReader getReader() throws IOException {
// Create a reader from cachedContent
// and return it
}
}
Run Code Online (Sandbox Code Playgroud)
为了实现MultipleReadHttpRequest,您可以ContentCachingRequestWrapper从spring框架看一下,它基本上是一样的.
这种方法有其自身的缺点.首先,它效率有点低,因为对于每个请求,请求主体至少被读取两次.另一个重要的缺点是,如果您的请求正文包含10 GB有价值的流,您会读取该10 GB数据,甚至更糟糕的是将其带入内存以供进一步检查.
| 归档时间: |
|
| 查看次数: |
26577 次 |
| 最近记录: |