我對javax.servlet.http.HttpSession的文檔感到困惑。
它說:無法理解會話對象行爲
會話用於維護多個 頁面請求的狀態和用戶身份。會話可以通過使用cookie或通過URL重寫進行維護。
現在Cookie和URL重寫都由服務器中的應用程序代碼(即我們的代碼)處理。
然後它說,與當會話被認爲是new
到:
服務器認爲,直到它已被 客戶端加入了一個會話是新的。在客戶端加入會話之前,isNew方法 會返回true。值true可以指示以下三種情況之一:
1.客戶端尚不知道會話
2.會話尚未開始
3.客戶端選擇不加入會話。如果客戶端僅支持cookie並選擇拒絕服務器發送的任何cookie ,則會發生此情況。如果服務器支持URL重寫,則通常不會發生這種情況 。
我不清楚什麼時候考慮/意味着client has joined the session
。
我的意思是,如果我不使用從我的web應用程序的cookie(或URL重寫),我有以下幾點:從IP一
- POST到服務器
- 200確定從服務器到
- POST從IP A到服務器
在步驟3將在session.isNew()
返回true或false?我從文檔中看不清楚。
它會返回錯誤(即會話不是新的),我將不得不打電話session.invalidate()
爲了創建一個新的會話?
這使我更加困惑的原因是因爲我正在調試一段代碼,其中客戶端是HTTP應用程序,但不是Web瀏覽器,我發現在步驟3中session.isNew()
不返回true
,雖然沒有cookie或url重寫在服務器代碼中。
所以我無法弄清楚發生了什麼。
任何可能有助於理解的信息?
您似乎對cookie感到困惑:servlet容器會在響應中爲您添加會話cookie,並從請求中爲您讀取它。你不需要做任何事情。如果客戶端瀏覽器不接受cookie,則URL自動重寫將自動使用,只要您始終對URL進行編碼(使用encodeURL,encodeRedirectURL或適當的JSP標籤)即可工作 – 2012-01-13 07:45:53
@JB Nizet:我認爲HTTP是無狀態的。所以這取決於程序員維護會話。所以你告訴我反正有一個容器會話? – Cratylus 2012-01-13 07:51:06
當您要求容器創建一個會話(使用request.getSession()或request.getSession(true))時,容器將會話cookie添加到發送給客戶端的下一個響應,並將會話ID附加到編碼的URL )。當它從下一個請求(或URL末尾的會話ID)接收到cookie時,它可以將請求關聯到先前創建的會話。如果你的客戶不接受cookies,你不必做任何事情,除非編碼URL。會話跟蹤和超時由容器完成。 – 2012-01-13 07:59:52