簡體   English   中英

多次讀取請求流

[英]Read the request stream multiple times

我們有一個Tomcat ValveBase類實現,正在對我們的servlet容器應用程序進行身份驗證。 驗證我們的http REST調用的一種方法是對它們簽名,然后在服務器端檢查簽名。 我們在ValveBase類中進行此檢查。

問題在於,在消耗了請求的InputStream(用於驗證簽名)之后,我們將請求(org.apache.catalina.connector.Request)傳遞到下一個Valve實現,並在到達servlet時將其傳遞給inputStream離開了。 沒有內容要傳送,因為它是在簽名驗證過程中消耗的。

在javax.servlet api中,可以使用HttpServletRequestWrapper來實現自己的ServletRequest並將實際請求作為構造函數參數傳遞。 在那種情況下,我們可以避免只讀取一次內容的情況,但是在“ catalina請求”的情況下,似乎比我們想象的要復雜。 有任何想法嗎? 謝謝。

長期以來,針對Tomcat 提出增強請求,要求以類似於過濾器的方式支持在Valve中使用包裝器。

該錯誤包含一個補丁,可能需要為Tomcat 7.0.x更新。

鑒於您已經在使用自定義閥,因此添加補丁可能不會有太大的飛躍。 有了該補丁程序之后,您應該可以包裝內部Request對象,並以與Filter解決方案類似的方式解決此問題(我認為該解決方案涉及保存請求正文的副本-注意DoS問題)。

當然,這是完全未經測試的。 作為一種嘗試,如果它可以工作並且您提供了更新的補丁(將其附加到Bugzilla報告中),作為激勵,我將嘗試將其包含在Tomcat 8.0.x和7.0.x中(前提是它不需要任何更改現有的API)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM