我们有一个 Tomcat ValveBase 类实现,它正在为我们的 servlet 容器应用程序进行身份验证。验证我们的 http REST 调用的一种方法是对它们进行签名,然后在服务器端检查签名。我们在 ValveBase 类中进行此检查。
问题是,在我们使用请求的 InputStream(用于验证签名)之后,我们将请求(org.apache.catalina.connector.Request)传递给下一个 Valve 实现,当它到达 servlet 时,inputStream离开了。没有要传递的内容,因为它在签名验证过程中被消耗。
在 javax.servlet api 中,您可以使用 HttpServletRequestWrapper 来实现您自己的 ServletRequest 并将真实请求作为构造函数参数传递。在那种情况下,我们能够避免内容只被读取一次的情况,但在 catalina Request 的情况下,似乎比我们想象的要微妙。有任何想法吗?谢谢。