0

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

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

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

4

1 回答 1

0

有一个长期存在的针对 Tomcat 的增强请求,以支持以与过滤器类似的方式在 Valves 中使用的包装器。

该错误包括一个可能需要为 Tomcat 7.0.x 更新的补丁。

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

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

于 2013-10-18T08:11:16.397 回答