2011-02-28 87 views
12

是HttpSession中的Java Servlet的僅的Java HttpSession中

HttpSession s = request.getSession(); 

後產生的?

在我的代碼中,我沒有寫這個,但是當我使用if (request.getSession(false) == null) ...時,它不起作用。爲什麼?

+1

你是什麼意思'它不起作用?你有例外嗎?如果你的測試返回與null不同的東西,這意味着該會話已經存在,並且不需要創建一個新的。 – reef 2011-02-28 10:09:19

+0

所以你得到request.getSession(false)!= null。 – PeterMmm 2011-02-28 10:11:05

+0

我的意思是(request.getSession(false)== null)應該是真的,但它是假的,我不知道爲什麼 – Sergey 2011-02-28 10:11:13

回答

16

調用request.getSession()時會創建HttpSession。<%@ page session="false">

是否使用JSP:

如果您在默認情況下訪問JSP會自動創建一個session.This行爲可以通過禁用?

+0

非常感謝,它幫助 – Sergey 2011-02-28 10:21:44

+0

這似乎也從頁面請求中刪除會話(如果存在的話)。 – 2012-09-12 20:10:25

+0

leif8:不,它不會從我的頁面中刪除會話 – peenut 2012-11-02 13:57:17

0

嘗試從瀏覽器中刪除會話cookie並進行另一個測試。如果它不起作用,那麼其他組件在該調用之前正在創建一個新的會話。

15

讀的JavaDoc,上面清清楚楚地寫着:

此說,request.getSession()

返回與此請求相關的當前會話,或者如果請求沒有會話,創建一個。

而另一個變種request.getSession(isCreate)

返回與此請求關聯的HttpSession的電流,或者如果沒有當前會話,並創建爲true,則返回一個新的會話。

如果create爲false且請求沒有有效的HttpSession,則此方法返回null。

要確保會話得到正確維護,您必須在提交響應之前調用此方法。如果容器使用cookie來維護會話完整性,並且在提交響應時被要求創建新會話,則會拋出IllegalStateException。


更新

對位的研究,我發現,會話是創建除非request.getSession()被稱爲地方。由於,The servlet container uses this interface to create a session between an HTTP client and an HTTP server.默認情況下,您的Servlet容器很有可能會爲您創建會話。

參考:

  1. Java文檔HttpSession
  2. 論JavaRaunch:is HttpSession created automatically?

但是,更安全側,使用request.getSession()來獲取會話,並使用request.getSession(false)只有當你需要驗證一個會話是否已經創建。

+0

這就是問題所在。我不創建任何HttpSession。我不使用request.getSession()。我第一次檢查它是if(request.getSession(FALSE)== null)它應該是true,但它不是 – Sergey 2011-02-28 10:14:44

+0

'request.getSession()'不是創建HTTP會話的唯一方法。 – Nishant 2011-02-28 10:16:53

+0

其他是什麼? – Sergey 2011-02-28 10:17:54

3

除了Nishant的回答說明,會話可以由JSP頁面隱式創建,除非您將它們配置爲不創建與<%@ page session = "false" %>的會話。

1

爲了使它完成:

  • 會話沒有創建,除非你調用request.getSession(),在你的servlet,使用request.getSession(false)獲得,而無需創建新的會話
  • 現有會話,如果你使用JSP頁面,會話自動爲您創建 - 變量session - 除非您指定<%@ page session="false" %>
  • 即使您的會話是自動創建的,您可以使用session.isNew()找出它是否已新創建