Java 多次读取请求流

Java 多次读取请求流,java,tomcat,servlets,request,Java,Tomcat,Servlets,Request,我们有一个Tomcat ValveBase类实现,它正在为我们的servlet容器应用程序进行身份验证。验证http REST调用的一种方法是对它们进行签名,然后在服务器端检查签名。我们在ValveBase类中执行此检查 问题是,在我们使用请求的InputStream(用于验证签名)之后,我们将请求(org.apache.catalina.connector.request)传递给下一个valve实现,当它到达servlet时,InputStream就消失了。没有要交付的内容,因为它是在签名验证

我们有一个Tomcat ValveBase类实现,它正在为我们的servlet容器应用程序进行身份验证。验证http REST调用的一种方法是对它们进行签名,然后在服务器端检查签名。我们在ValveBase类中执行此检查

问题是,在我们使用请求的InputStream(用于验证签名)之后,我们将请求(org.apache.catalina.connector.request)传递给下一个valve实现,当它到达servlet时,InputStream就消失了。没有要交付的内容,因为它是在签名验证过程中使用的

在javax.servlet api中,可以使用HttpServletRequestWrapper实现自己的ServletRequest,并将实际请求作为构造函数参数传递。在这种情况下,我们能够避免内容只被阅读一次的情况,但在catalina请求的情况下,似乎比我们想象的更微妙。有什么想法吗?谢谢。

有一个针对Tomcat的开放式接口,用于支持包装器,以类似于过滤器的方式在阀门中使用

该漏洞包括一个可能需要更新Tomcat7.0.x的补丁

考虑到您已经在使用自定义阀,添加补片可能不会有太大的飞跃。有了这个补丁,您应该能够包装内部请求对象,并以与过滤器解决方案类似的方式解决这个问题(我假设这涉及到保存请求正文的副本-注意DoS问题)


当然,这完全没有经过测试。作为一种尝试的激励,如果它确实有效,并且您提供了更新的补丁(将其附加到Bugzilla报告中),我将考虑将其包括在Tomcat 8.0.x和7.0.x中(前提是它不需要对现有API进行任何更改)。

验证REST服务不需要定制ValveBase类,您只需配置2路SSL即可不幸的是,这些是我们必须实现的规范,我们还必须依赖于旧代码,ValveBase就是其中的一部分。