2014-09-25 26 views

回答

5

HttpServletRequest對象的生命週期就是這樣的:服務HTTP Servlet請求的時間。

它可能在調用servlet的doGet()doPost()等方法之前創建,並可能在此之後被銷燬。只有在提供請求時才使用它。

注:然而Servlet容器可以重用多個請求HttpServletRequest對象(這是通常的情況),但是它們將被「清潔」或復位,所以沒有對象(如參數或屬性)之間會泄漏要求。這僅僅是由於性能問題:重置一個對象比重複一個現有對象並創建一個對象更快更便宜。

在一個典型的Servlet容器實現中,如果HTTP請求進入,那麼當請求的HTTP輸入數據被Servlet容器解析時,創建一個HttpServletRequest。整個請求可能會被懶惰地初始化(例如,如果參數是真正被訪問的,例如通過getParameter()方法),則參數可能僅被解析和填充。然後此HttpServletRequest(其延伸ServletRequest)通過Servlet過濾器,然後傳遞到Servlet.service()這將調度基於HTTP方法(GETPOSTPUT等)調用doGet()doPost()等。然後,請求仍然存在,直到請求 - 響應對循環遍歷整個過濾器鏈。然後它將被銷燬或重置(在用於其他HTTP請求之前)。

+0

如果有人將HttpServletRequest對象傳遞給其他地方,那麼HttpServletRequest對象將保持超出請求週期。您怎麼看? – 2014-09-25 10:43:35

+2

是的,你可以這樣做,但在請求週期外使用請求對象是無效的。所以強烈不建議。 – icza 2014-09-25 10:44:46

+1

@icza你不知道你剛纔幫了我多少 - 我們有一個問題,在'HttpServletRequest'通過spring的'@ Async'傳遞了一段時間,並且在某些時候它是被清除的字段。你的輸入 - 「然而,Servlet容器可以重複使用HttpServletRequest對象來處理多個請求(這通常是這種情況),但它們將被」清除「或重置,因此沒有對象(如參數或屬性)會在請求之間泄漏。發現!**。謝謝! – Eugene 2017-10-05 08:15:22

相關問題