【发布时间】: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