我已经实现了一个过滤器,在其中我想首先读取请求的内容进行一些检查,然后我想继续。
但问题是,在过滤器链的以下过滤器中getParameters()
方法来自class Request (org.eclipse.jetty.server.Request)
被称为而不是getParameters()
方法来自class ContentCachingRequestWrapper
。所以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 作为应用程序服务器
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!!
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)