2013-10-17 161 views
0

我們有一個Tomcat ValveBase類實現正在爲我們的servlet容器應用程序進行身份驗證。驗證我們的http REST呼叫的一種方法是對它們進行簽名,然後檢查服務器端的簽名。我們在ValveBase類中檢查。多次閱讀請求流

問題是,在我們使用請求的InputStream(用於驗證簽名)之後,我們將請求(org.apache.catalina.connector.Request)傳遞給下一個閥門實現,並在它到達servlet,inputStream消失了。由於在簽名驗證程序中使用了內容,因此不會傳送內容。

在javax.servlet API中,可以使用HttpServletRequestWrapper實現自己的ServletRequest,並將實際請求作爲構造函數參數傳遞。在這種情況下,我們避免了只讀一次內容的情況,但在催化劑請求的情況下,似乎比我們想象的更加微妙。有任何想法嗎?謝謝。

+0

認證REST服務不需要定製的ValveBase類,您可以配置2路SSL(客戶端證書認證)。 – gerrytan

+0

不幸的是,這些是我們必須實現的規格,我們也必須依賴ValveBase所屬的遺留代碼。 – nucatus

回答

0

有一個針對Tomcat的long standing enhancement request打開,以支持類似於過濾器的方式使用閥門中的包裝。

該錯誤包含可能需要更新Tomcat 7.0.x的修補程序。

鑑於您已經在使用自定義閥門,因此添加補丁可能不是太大的飛躍。使用該補丁後,您應該能夠包裝內部的Request對象,並以類似於Filter解決方案的方式解決此問題(我假設需要保存請求主體的副本 - 注意DoS問題)。

這當然是完全未經測試的。作爲嘗試它的動機,如果它能夠工作並提供更新的補丁(附加到Bugzilla報告中),我會考慮將它包含在Tomcat 8.0.x和7.0.x中(假設它不需要任何補丁改變現有的API)。