我已经实现了一个过滤器,其中我想首先阅读请求的内容以进行一些检查,然后我想继续。
但问题是,在以下来自过滤器链的过滤器中调用来自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
答案 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 ,您可能面临此问题。如果不是这样,请检查并告诉我,然后我会进一步调试。