使用ContentCachingRequestWrapper会导致空参数映射

时间:2018-03-13 07:19:59

标签: java spring embedded-jetty

我已经实现了一个过滤器,其中我想首先阅读请求的内容以进行一些检查,然后我想继续。

但问题是,在以下来自过滤器链的过滤器中调用来自getParameters()的{​​{1}}方法,而不是来自class Request (org.eclipse.jetty.server.Request)的{​​{1}}方法。因此getParameters()未填充且始终为空。

以下是我的代码的样子:

class ContentCachingRequestWrapper

在控制器中:

parametersMap

在控制器中,参数Map始终为空。 如果我不在我的过滤器中调用servletRequest.getInputStream(),则填充参数Map。

我正在使用Spring Boot 1.5.6和Jetty作为Application Server

2 个答案:

答案 0 :(得分:2)

ContentCachingRequestWrapper不会那样工作并且有一些限制。据我记忆,只有POST请求和内容类型应为application/x-www-form-urlencoded。如果这适合你,那么你应该做什么:

final HttpServletRequest req = (HttpServletRequest) request;
HttpServletRequest servletRequest = new ContentCachingRequestWrapper(req);
servletRequest.getParameterMap(); // needed for caching!!

String read = ByteSource.wrap(servletRequest.getContentAsByteArray())
    .asCharSource(StandardCharsets.UTF_8).read(); // Please note that we're not touching input stream!!

希望这有帮助。

答案 1 :(得分:1)

请尝试下面提到的两个解决方案:1。HttpServletRequestWrapper servletRequest = new ContentCachingRequestWrapper(req);
或者2。 ContentCachingRequestWrapper servletRequest = new ContentCachingRequestWrapper(req);而不是 HttpServletRequest servletRequest = new ContentCachingRequestWrapper(req);你尽可能ContentCachingRequestWrapper HttpServletRequestWrapper延伸 ServletRequestWrapper 延伸 {{1} }和实现 HttpServletRequest
因此,通过执行 upcasting ,您可能面临此问题。如果不是这样,请检查并告诉我,然后我会进一步调试。