我们有一个Tomcat ValveBase类实现,它正在为我们的servlet容器应用程序进行身份验证。验证我们的http REST调用的一种方法是对它们进行签名,然后检查服务器端的签名。我们在ValveBase类中进行检查。
问题是,在我们使用请求的InputStream(用于验证签名)之后,我们将请求(org.apache.catalina.connector.Request)传递给下一个Valve实现,并在它到达servlet时,inputStream消失了。没有要传递的内容,因为它是在签名验证程序中使用的。
在javax.servlet api中,您可以使用HttpServletRequestWrapper来实现自己的ServletRequest,并将实际请求作为构造函数参数传递。在这种情况下,我们能够避免内容只被阅读一次的情况,但在catalina请求的情况下,似乎比我们想象的更加微妙。有任何想法吗?感谢。
答案 0 :(得分:0)
对Tomcat开放long standing enhancement request以支持在Valves中使用的包装器,类似于Filters。
该错误包含一个可能需要更新Tomcat 7.0.x的补丁。
鉴于您已经在使用自定义阀门添加补丁可能不是太大的飞跃。有了这个补丁,你应该能够包装内部Request对象并以与Filter解决方案类似的方式解决这个问题(我假设它涉及保存请求体的副本 - 注意DoS问题)。
这当然是完全未经测试的。作为尝试它的动机,如果它确实有效并且你提供了更新的补丁(将它附加到Bugzilla报告),我会考虑将它包含在Tomcat 8.0.x和7.0.x中(假设它不需要任何补丁)对现有API的更改。)