2012-01-13 73 views
1

我對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一

  1. POST到服務器
  2. 200確定從服務器到
  3. POST從IP A到服務器

在步驟3將在session.isNew()返回true或false?我從文檔中看不清楚。
它會返回錯誤(即會話不是新的),我將不得不打電話session.invalidate()爲了創建一個新的會話?
這使我更加困惑的原因是因爲我正在調試一段代碼,其中客戶端是HTTP應用程序,但不是Web瀏覽器,我發現在步驟3中session.isNew()不返回true,雖然沒有cookie或url重寫在服務器代碼中。
所以我無法弄清楚發生了什麼。
任何可能有助於理解的信息?

+2

您似乎對cookie感到困惑:servlet容器會在響應中爲您添加會話cookie,並從請求中爲您讀取它。你不需要做任何事情。如果客戶端瀏覽器不接受cookie,則URL自動重寫將自動使用,只要您始終對URL進行編碼(使用encodeURL,encodeRedirectURL或適當的JSP標籤)即可工作 – 2012-01-13 07:45:53

+0

@JB Nizet:我認爲HTTP是無狀態的。所以這取決於程序員維護會話。所以你告訴我反正有一個容器會話? – Cratylus 2012-01-13 07:51:06

+2

當您要求容器創建一個會話(使用request.getSession()或request.getSession(true))時,容器將會話cookie添加到發送給客戶端的下一個響應,並將會話ID附加到編碼的URL )。當它從下一個請求(或URL末尾的會話ID)接收到cookie時,它可以將請求關聯到先前創建的會話。如果你的客戶不接受cookies,你不必做任何事情,除非編碼URL。會話跟蹤和超時由容器完成。 – 2012-01-13 07:59:52

回答

3

這裏是Session Tracking

Client has joined the session一個很好的例子是指客戶提出後續請求,其中包括會話ID,可以通過您的Web服務器識別。如果啓用了cookie,則jsessionid將通過cookie傳遞,否則 - 它應該包含在URL本身中 - 例如http://localhost:8080/bookstore1/cashier;jsessionid=c0o7fszeb1

來自Core標記庫的JSP c:url將爲您處理URL重寫。

在B2B通信的情況下,您必須自己獲取會話ID並手動將其包含在隨後的請求中。

示例:從IP甲

  1. POST到服務器
  2. 200 OK從服務器到甲
  3. 甲從響應獲得session id
  4. 從IP A到服務器
  5. POST和包括獲得session id

更新:

請考慮閱讀優秀文章 - "Web Based Session Management: Best practices in managing HTTP-based client sessions."這是關於如何模擬HTTP會話並與Java無關的一般概述。

+0

是不是'jsessionid' java特定? – Cratylus 2012-01-13 07:49:06

+0

是的,它是特定於java的。符合JavaEE的服務器必須使用此名稱,但有些服務器允許配置該名稱。 – yatskevich 2012-01-13 07:54:32

+0

但我使用的客戶端不在Java – Cratylus 2012-01-13 07:56:06