【问题标题】:Read the request stream multiple times多次读取请求流
【发布时间】:2013-10-26 15:14:02
【问题描述】:

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

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

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

【问题讨论】:

  • 认证 REST 服务不需要自定义 ValveBase 类,您可以配置 2 路 SSL(客户端证书认证)。
  • 不幸的是,这些是我们必须实现的规范,我们还必须依赖 ValveBase 所属的遗留代码。

标签: java tomcat servlets request


【解决方案1】:

有一个针对 Tomcat 的 long standing enhancement request 开放,以支持包装器以类似于过滤器的方式在 Valves 中使用。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-10-22
    • 2020-10-25
    • 2017-08-18
    • 2019-07-23
    • 2015-10-02
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2016-11-30
    相关资源
    最近更新 更多