使用 ContentCachingRequestWrapper 会导致空参数映射
Using ContentCachingRequestWrapper causes Empty Parameters Map
我实现了一个过滤器,我想先读取请求的内容进行一些检查,然后我想继续。
但问题是,在过滤器链的以下过滤器中,调用了 class Request (org.eclipse.jetty.server.Request)
中的 getParameters()
方法,而不是 class ContentCachingRequestWrapper
中的 getParameters()
方法。所以 parametersMap
没有被填充并且总是空的。
我的代码如下所示:
@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
) {
....
}
在控制器中,params Map 始终为空。
如果我不在我的过滤器中调用 servletRequest.getInputStream(),params Map 就会被填充。
我正在使用 Spring Boot 1.5.6,Jetty 作为应用程序服务器
请尝试下面提到的两个建议解决方案:
1. HttpServletRequestWrapper servletRequest = new ContentCachingRequestWrapper(req);
或
2。 ContentCachingRequestWrapper servletRequest = new ContentCachingRequestWrapper(req);
而不是
HttpServletRequest servletRequest = new ContentCachingRequestWrapper(req);
你可以 check here ContentCachingRequestWrapper
class 扩展 HttpServletRequestWrapper
extends ServletRequestWrapper
and implements HttpServletRequest
.
所以这里通过执行 upcasting ,您可能正面临这个问题。请检查并告诉我是否不是这种情况,然后我会进一步调试它。
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!!
希望对您有所帮助。
我实现了一个过滤器,我想先读取请求的内容进行一些检查,然后我想继续。
但问题是,在过滤器链的以下过滤器中,调用了 class Request (org.eclipse.jetty.server.Request)
中的 getParameters()
方法,而不是 class ContentCachingRequestWrapper
中的 getParameters()
方法。所以 parametersMap
没有被填充并且总是空的。
我的代码如下所示:
@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
) {
....
}
在控制器中,params Map 始终为空。 如果我不在我的过滤器中调用 servletRequest.getInputStream(),params Map 就会被填充。
我正在使用 Spring Boot 1.5.6,Jetty 作为应用程序服务器
请尝试下面提到的两个建议解决方案:
1. HttpServletRequestWrapper servletRequest = new ContentCachingRequestWrapper(req);
或
2。 ContentCachingRequestWrapper servletRequest = new ContentCachingRequestWrapper(req);
而不是
HttpServletRequest servletRequest = new ContentCachingRequestWrapper(req);
你可以 check here ContentCachingRequestWrapper
class 扩展 HttpServletRequestWrapper
extends ServletRequestWrapper
and implements HttpServletRequest
.
所以这里通过执行 upcasting ,您可能正面临这个问题。请检查并告诉我是否不是这种情况,然后我会进一步调试它。
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!!
希望对您有所帮助。