Java 使用ContentCachingRequestWrapper会导致参数映射为空

Java 使用ContentCachingRequestWrapper会导致参数映射为空,java,spring,embedded-jetty,Java,Spring,Embedded Jetty,我已经实现了一个过滤器,在这个过滤器中,我想先读取请求的内容进行一些检查,然后再继续 但问题是,在下面的过滤器链中,调用了类请求(org.eclipse.jetty.server.Request)中的getParameters()方法,而不是类ContentCachingRequestWrapper中的getParameters()方法。因此,参数map未填充,并且始终为空 下面是我的代码的样子: @Component @Order(1) public class EncodingFilter

我已经实现了一个过滤器,在这个过滤器中,我想先读取请求的内容进行一些检查,然后再继续

但问题是,在下面的过滤器链中,调用了
类请求(org.eclipse.jetty.server.Request)
中的
getParameters()
方法,而不是
类ContentCachingRequestWrapper
中的
getParameters()
方法。因此,
参数map
未填充,并且始终为空

下面是我的代码的样子:

@Component
@Order(1)
public class EncodingFilter extends GenericFilterBean {

private static final Logger LOG = 
LoggerFactory.getLogger(EncodingFilter.class);

@Override
public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain) throws IOException, ServletException {

final HttpServletRequest req = (HttpServletRequest) request;
HttpServletRequest servletRequest = new ContentCachingRequestWrapper(req);

String read = ByteSource.wrap(ByteStreams.toByteArray(servletRequest.getInputStream()))
        .asCharSource(StandardCharsets.UTF_8).read();
// Doing analysis .....
// last step call filter chain
chain.doFilter(servletRequest, response);
}
}
在控制器中:

@PostMapping(
    value = Endpoints.Janus.INIT,
    produces = MediaType.TEXT_HTML_VALUE
)
public ModelAndView controller(
    @RequestParam LinkedCaseInsensitiveMap<String> params,
    HttpServletRequest servletRequest
) {
 ....  
}
@PostMapping(
值=Endpoints.Janus.INIT,
生成=MediaType.TEXT\u HTML\u值
)
公共模型和视图控制器(
@RequestParam LinkedCaseInsensitiveMap参数,
HttpServletRequest servletRequest
) {
....  
}
在控制器中,参数映射始终为空。 如果我没有在过滤器中调用servletRequest.getInputStream(),则会填充参数映射


我正在使用Spring Boot 1.5.6,Jetty作为应用服务器

请尝试下面提到的两种建议解决方案:
1<代码>HttpServletRequestWrapper servletRequest=新的ContentCachingRequestWrapper(req)

2
ContentCachingRequestWrapper servletRequest=新ContentCachingRequestWrapper(req)
代替
HttpServletRequest-servletRequest=newcontentcachingrequestwrapper(req)

尽可能地
ContentCachingRequestWrapper
class扩展了
HttpServletRequestWrapper
,该类扩展了
ServletRequestWrapper
实现了
HttpServletRequest

因此,这里通过执行向上转换,您可能正面临这个问题。请检查并让我知道是否不是这样,然后我将进一步调试它。

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!!

希望这有帮助。

Thx感谢您的支持。不幸的是,这两种解决方案都不能解决我的问题。好的,我会进一步研究。这没有意义。谢谢。这就是solution@MichaelKronberger,请接受这个答案,如果它有帮助的话。提前解释谢谢!投票决定答案!注意:
multipart/formdata
也与
request.getParameter
调用和multipart
request.getPart
方法相关。什么是ByteSource?