一、Session機制
session機制採用的是在server端保持 HTTP 狀态資訊的方案 。
server使用一種類似于散清單的結構(也可能就是使用散清單)來儲存資訊。
當程式須要為某個client的請求建立一個session時,server首先檢查這個client的請求裡是否包括了一個session辨別(即sessionId),假設已經包括一個sessionId則說明曾經已經為此客戶建立過session,server就依照session id把這個session檢索出來使用(假設檢索不到,可能會建立一個。這樣的情況可能出如今服務端已經删除了該使用者相應的session對象,但使用者人為地在請求的URL後面附加上一個JSESSION的參數)。假設客戶請求不包括sessionId,則為此客戶建立一個session而且生成一個與此session相關聯的sessionId。這個session id将在本次響應中傳回給client儲存。
二、儲存SessionID的方式
①.儲存session id的方式能夠採用cookie,這樣在互動過程中浏覽器能夠自己主動的依照規則把這個辨別發送給server。
②.因為cookie可以被人為的禁用。必須有其他的機制以便在cookie被禁用時仍然可以把session id傳遞回server,常常採用的一種技術叫做URL重寫,就是把session id附加在URL路徑的後面,附加的方式也有兩種,一種是作為URL路徑的附加資訊,還有一種是作為查詢字元串附加在URL後面。網絡在整個互動過程中始終保持狀态,就必須在每一個client可能請求的路徑後面都包括這個session id。
Session Cookie
session通過SessionID來區分不同的客戶, session是以cookie或URL重寫為基礎的,預設使用cookie來實作,系統會創造一個名為JSESSIONID的輸出cookie。這稱之為session cookie,以差别persistent cookies(也就是我們通常所說的cookie),session cookie是存儲于浏覽器記憶體中的,并非寫到硬碟上的,通常看不到JSESSIONID,可是當把浏覽器的cookie禁止後,webserver會採用URL重寫的方式傳遞Sessionid。這時位址欄看到
session cookie針對某一次會話而言,會話結束session cookie也就随着消失了,而persistent cookie僅僅是存在于client硬碟上的一段文本。
關閉浏覽器,僅僅會是浏覽器端記憶體裡的session cookie消失,但不會使儲存在server端的session對象消失,相同也不會使已經儲存到硬碟上的持久化cookie消失。
三、Session的生命周期
1)什麼時候建立HTTPSession對象?
①:對于JSP:浏覽器訪問訪問server端的不論什麼一個JSP,server都會馬上建立一個HttpSession對象?
不一定.
*若目前的JSP 是client訪問的目前WEB 應用的第一個資源,且 JSP 的 page 指定的session屬性為false。則server就不會為JSP建立一個HttpSession對象
*若目前JSP不是client訪問的目前WEB應用的第一個資源,且其它頁面已經建立一個HttspSession對象。則server也不會為目前JSP頁面建立一個HttpSession對象,而會把和目前會話相關的那個HTTPSession對象傳回給目前的JSP頁面
②:對于Servlet::若 Servlet 是client訪問的第一個WEB應用的資源,則僅僅有調用了request.getSession() 或 request.getSession(true) 才會建立HTTPSession對象
2)page 指令 的session="false" 究竟什麼意思
*目前JSP頁面禁用session隐含變量。但能夠使用其它的顯示的 HttpSession對象
3)在Servlet 中 怎樣擷取HTTPSession對象?
*request.getSession(boolean create):當create 為 false 時,若沒有和目前JSP頁面關聯的 Httpsession 對象,傳回null,若有則傳回 HttpSession 對象。
當create為 true ,一定會傳回 HttPSession 對象,若沒有和目前JSP頁面關聯的HTTPSession對象,則server會建立一個新的HTTPSession對象,若有關聯。則直接傳回關聯的。
*request..getSession()等同于request.getSession(true)
4)什麼時候銷毀HttpSession對象
①.直接調用 HttpSession 的 invalidate() 方法:立馬是HTTPSession對象失效
②.server解除安裝了目前 WEB 應用
③.超出了 HTTPSession 的過期時間
* 設定HttpSession的過期時間,調用session.setMaxInactiveInterval(int x); 機關是秒
* 在Tomcat 的 WEB.xml中設定 (機關是分鐘。假設session不設定生命周期,就會使用這個預設的)
<session-config>
<session-timeout>30</session-timeout >
</session-config>
④. 并非關閉了浏覽器就銷毀了 session ,是以說要訪問到Session對象,能夠通過持久化Cookie 和 URL重寫 兩種方式 。
具體看 HttpSession API
代碼示範樣例
login.jsp
hello.jsp
logout.jsp
">又一次登入</a>
<%
session.invalidate();//殺死session
%>
</body>
</html></span>
HttpSession接口中的方法
getId方法 getCreationTime方法
getLastAccessedTime方法 setMaxInactiveInterval方法
getMaxInactiveInterval方法 isNew方法
假設client請求消息中傳回了一個與Servlet程式目前獲得的HttpSession對象的會話辨別号同樣的會話辨別号,則覺得這個HttpSession對象不是建立的。
invalidate方法 getServletContext方法
setAttribute方法 getAttribute方法
removeAttribute方法 getAttributeNames方法
HttpServletRequest接口中的Session方法
getSession方法
public HttpSession getSession(boolean create)
public HttpSession getSession()
isRequestedSessionIdValid方法
isRequestedSessionIdFromCookie方法
isRequestedSessionIdFromURL方法
利用URL重寫實作Session跟蹤
Servlet規範中引入了一種補充的會話管理機制,它同意不支援Cookie的浏覽器也能夠與WEBserver保持連續的會話。這樣的補充機制要求在響應消息的實體内容中必須包括下一次請求的超連結,并将會話辨別号作為超連結的URL位址的一個特殊參數。
将會話辨別号以參數形式附加在超連結的URL位址後面的技術稱為URL重寫。
假設在浏覽器不支援Cookie或者關閉了Cookie功能的情況下,WEBserver還要可以與浏覽器實作有狀态的會話。就必須對全部可能被client訪問的請求路徑(包含超連結、form表單的action屬性設定和重定向的URL)進行URL重寫。
HttpServletResponse接口中定義了兩個用于完畢URL重寫方法:
encodeURL方法
encodeRedirectURL方法
關于在IE下禁用cookie,重新整理SessionId不變的情況
從網上找到了答案,僅僅要是IE或基于IE核心的浏覽器,關閉Cookie實際上并沒有真的關閉,論壇上都是噴IE的
在Chrome 和 火狐 上試驗。SessionID不重新整理的問題就不存在了
本文轉自mfrbuaa部落格園部落格,原文連結:http://www.cnblogs.com/mfrbuaa/p/5351510.html,如需轉載請自行聯系原作者