session什么時候被創(chuàng)建
*************************************************************************************
一個常見的錯誤是以為 session 在有客戶端訪問時就被創(chuàng)建圾结,然而事實是直到某 server 端程序(如 Servlet )調(diào)用HttpServletRequest.getSession(true)這樣的語句時才會被創(chuàng)建荞估。
*************************************************************************************
我一開始還不信玷过,做個試驗我信了。
一開始不信是因為茉继,用 FireFox 測試清空了Cookie ,只要一跑一個jsp 兰粉,馬上會看到生成了一個名字是 JSESSIONID 的Cookie 坟岔,注意這個是? Session Cookie (會話Cookie)豫缨,不是 Persistent Cookie (持久Cookie),這個《Cookie和Session專題 》一文中講的很明白端朵,會話 Cookie 是為實現(xiàn) session 機制而采用的在 Client 端與 Server 端之間保持狀態(tài)的解決方案之一好芭,在默認情況下是保存在 Client 端內(nèi)存中的。注意:會話 Cookie 的“會話”這里不是指 Server 端的 Session 冲呢,而是指的是瀏覽器栓撞,所以會話 Cookie 的生命周期不是與 Server 端的 Session 那個會話相同,而是與瀏覽器相同碗硬,就是說只要開著瀏覽器會話 Cookie 就存在,關(guān)閉瀏覽器它就過期了瓢颅。但是會話 Cookie 的值是與 Server 端的 SessionId 對應相同的恩尾。就是說會話Cookie隨著Server端Session的創(chuàng)建而創(chuàng)建,但并不隨著Session的過期而過期挽懦,而是隨著Client端的瀏覽器關(guān)閉而銷毀翰意。 這說明只要會話Cookie 出現(xiàn)了,Server 端的 Session 就已經(jīng)創(chuàng)建了信柿。
我一開始的錯誤想法是:我的 jsp 里沒有 HttpServletRequest.getSession(true) 的代碼阿冀偶,但是 JSESSIONID 的Cookie 出現(xiàn)了就說明 Server 端 Session 創(chuàng)建了,這與《Cookie和Session專題 》上面講的不符啊渔嚷,不過馬上想通了进鸠,jsp 屬于動態(tài)頁,本質(zhì)就是一個 Servlet 形病,編譯后的 jsp 是要到 Server 端進行交互的(即便 jsp 里沒寫一句交互的代碼)客年,因為 jsp 里有內(nèi)置對象,內(nèi)置對象就是和 Server 交互的產(chǎn)物漠吻,所以如果你的首頁是個 jsp 頁的話量瓜,即便沒有HttpServletRequest.getSession(true),Session 也會創(chuàng)建途乃。
如果首頁是*.html 就不同了绍傲,再將 FireFox 的 Cookie 都清除了,將首頁設置為 index.html, 回車耍共,查看烫饼,果然這次沒有JSESSIONID 的 Cookie 生成,這說明Server的Session也沒有創(chuàng)建划提,讓 index.html 提交到一個Servlet, 確實可以證明沒有 HttpServletRequest.getSession(true) 枫弟,Sesion是不會創(chuàng)建的, 即便Servlet又轉(zhuǎn)發(fā)(或者重定向)到第二個頁鹏往,只要第二個頁依然不是jsp頁淡诗,Session就依然不會創(chuàng)建骇塘,F(xiàn)ireFox 當然也沒有名字為 JSESSIONID 的 Cookie 生成。
那么我以前一直錯誤地認為當某個Client端請求開始時韩容,Session就創(chuàng)建了款违,此后Session就一直存在直到過期,而request在當前Client的一系列請求操作中有可能銷毀和新建群凶,所以Session的生命周期要比request長〔宓現(xiàn)在看來這么想大錯特錯了,Session和Request的生命周期根本就是火星和地球请梢,拿來相比是沒有任何意義的赠尾。好像是在問鯊魚和老虎PK誰會贏,沒有意義的問題. . .