我處於這種情況,我的應用程序需要檢查POST請求的內容/數據/正文/有效內容,而不更改後續getParameter調用的結果。閱讀HTTPServletRequest的POST正文,然後在Tomcat中調用getParameter
從InputStream讀取體:
主體可以使用從request.getInputStream
或從的BufferedReader request.getReader
InputStream的讀取。
讀POST參數:
POST請求通常包括在請求的主體中的請求參數。這些可以使用getParameter
來檢索。
問題:
第一getParameter
呼叫內部解析InputStream和插入所有參數成參數HashMap中。它要求inputStream仍然包含解析的內容。因此,人們無法檢查內容,並仍然有一個正在進行的getParameter調用。
的提案(但不充分)解決方案
創建緩存InputStream和返回的getInputStream緩存請求包裝。
我見過的解決方案建議所有網站上,但它不工作,因爲getParameter
實際上不叫getInputStream
,而是指埋在請求對象的原始INPUTBUFFER。我試過了,都是從Servlet內部和通過使用過濾器
我能想到的唯一解決方案涉及重寫getParameter實際上手動解析緩存的輸入流。但是這感覺是一個糟糕的主意。
有沒有人有別的辦法? (這是Tomcat 5.5)這感覺應該是一個常見的用例;我無法相信它有多難。
該問題的答案不是解決方案。我已經實現了它,但它無法解決問題。從那以後,我讀了tomcat源代碼,並意識到getParameter不會調用getInputStream,如上所述,所以不會從緩存的流版本中讀取。 請參閱http://grepcode.com/file/repo1.maven.org/maven2/tomcat/catalina/5.5.23/org/apache/catalina/connector/RequestFacade.java?av=f#342 我不是肯定爲什麼人們似乎發現它是一個解決方案。 – rewolf
getParameter方法調用getInputStream。首先,getParameter調用parseParameters然後調用parseParameters調用readPostBody然後調用readPostBody調用getInputStream。 – peakmuma