JavaWeb Session詳解


代碼地址如下:
http://www.demodashi.com/demo/12756.html

記得把這幾點描述好咯:代碼實現過程 + 項目文件結構截圖 + ## Session的由來

上一篇博文介紹了Cookie的相關知識,其中介紹了必須采用一種機制來唯一標識一個用戶,同時記錄該用戶的狀態。
於是就引入了第一種機制:Cookie機制;那么第二種就是Session機制。

Session機制:采用的是在服務器端保持Http狀態信息的方案。結合兩篇博文也可以看出兩種機制最明顯的區別就是cookie是存儲子在客戶端,
而Session是存儲在服務器端。具體兩者的區別我會在下一篇博文詳細介紹。

Session的定義即基本介紹

Session,有始有終的一系列動作/消息的意思,其實我們舉一個小例子來說:比如我們一次打電話,從接起電話到你掛斷電話的一系列過程可以稱為一個Session。
Session在Web開發環境下的語義又有了新的擴展,它的含義是指一類用來在客戶端與服務器端之間保持狀態的解決方案。
有時候Session也用來指這種解決方案的存儲結構。

Session存儲方式

服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。

Session標識傳遞的過程

當程序需要為某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端的請求里是否包含了一個session標識(即sessionId),
如果已經包含一個sessionId則說明以前已經為此客戶創建過session,服務器就按照session id把這個session檢索出來使用(如果檢索不到,
可能會新建一個,這種情況可能出現在服務端已經刪除了該用戶對應的session對象,但用戶人為地在請求的URL后面附加上一個JSESSION的參數)。
如果客戶請求不包含sessionId,則為此客戶創建一個session並且生成一個與此session相關聯的sessionId,這個sessionId將在本次響應中返回給客戶端保存。

下面是流程圖:

Session的幾種存儲方式

  1. 使用Cookie: 保存session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發送給服務器,這種cookie稱為session cookie。
    如下圖:

  2. URL重寫: 由於cookie可以被人為的禁用,必須有其它的機制以便在cookie被禁用時仍然能夠把session id傳遞回服務器,
    經常采用的一種技術叫做URL重寫,就是把session id附加在URL路徑的后面,附加的方式也有兩種,一種是作為URL路徑的附加信息,
    另一種是作為查詢字符串附加在URL后面。網絡在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑后面都包含這個session id。
    如下圖:

Session的創建與刪除

  1. Session創建
    (1). 對於Jsp: 若當前頁面為瀏覽器(客戶端)訪問web應用的第一個資源頁面且Jsp的Page指定的Session屬性的值為true。
    (2). 對於Servlet: 若當前Servlet為瀏覽器(客戶端)訪問web應用的第一個資源時,使用request.getSession()或request.getSession(true)創建。
  2. Session刪除
    (1). 調用session.invalidate()方法
    (2). 卸載web應用程序
    (3). 超過了HttpSession的過期時間

Session的超時管理

WEB服務器無法判斷當前的客戶端瀏覽器是否還會繼續訪問,也無法檢測客戶端瀏覽器是否關閉,所以,即使客戶已經離開或關閉了瀏覽器,
WEB服務器還要保留與之對應的HttpSession對象。

隨着時間的推移而不斷增加新的訪問客戶端,WEB服務器內存中將會因此積累起大量的不再被使用的HttpSession對象,並將最終導致服務器內存耗盡。

WEB服務器采用“超時限制”的辦法來判斷客戶端是否還在繼續訪問,如果某個客戶端在一定的時間之內沒有發出后續請求,WEB服務器則認為客戶端已經停止了活動,
結束與該客戶端的會話並將與之對應的HttpSession對象變成垃圾。

如果客戶端瀏覽器超時后再次發出訪問請求,WEB服務器則認為這是一個新的會話的開始,將為之創建新的HttpSession對象和分配新的會話標識號。

會話的超時間隔可以在web.xml(Tomcat服務器或者web應用程序)文件中設置,其默認值由Servlet容器定義。

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

具體實現

登錄頁面代碼實現

SessionId: <%= session.getId() %>
	<br/><br/>
	
	isCreateNew:<%= session.isNew() %>
	<br/><br/>
	
	maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
	<br/><br/>
	
	CreatedTime:<%= session.getCreationTime() %>
	<br/><br/>
	
	lastAccessedTime: <%= session.getLastAccessedTime() %>
	<br/><br/>
	
	<%
		Object username = session.getAttribute("username");
		if(username == null){
			username = "";
		}
	%>
	<form action="<%= response.encodeURL("loginSuccess.jsp") %>" method="post">
		username: <input type="text" name="username" value="<%= username%>"/><br/>
		<input type="submit" value="登錄"/>
	</form>
	

登錄成功頁面代碼實現

SessionId: <%= session.getId() %>
	<br/><br/>
	
	isCreateNew:<%= session.isNew() %>
	<br/><br/>
	
	maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
	<br/><br/>
	
	CreatedTime:<%= session.getCreationTime() %>
	<br/><br/>
	
	lastAccessedTime: <%= session.getLastAccessedTime() %>
	<br/><br/>
	
	Hello: <%= request.getParameter("username") %>
	<br/><br/>
	
	<%
		//將username存儲於session之中,便於在整個會話過程中記住當前user;
		// 當然服務器端可以找到session還是通過cookie(URL重寫)在客戶端和服務器端傳遞JSESSIONID
		session.setAttribute("username", request.getParameter("username"));
	%>
	

		<!-- 
		
			cookie被禁用的情況下使用url重寫的方式傳遞JSSESSIONID;
			重寫使用:response.encodeURL或response.encodeRedirectURL()都行
		-->
		

	<a href="<%= response.encodeURL("login.jsp") %>">重新登錄</a>
	<a href="<%= response.encodeURL("loginOut.jsp") %>">注銷</a>
	

注銷頁面實現

SessionId: <%= session.getId() %>
	<br/><br/>
	
	isCreateNew:<%= session.isNew() %>
	<br/><br/>
	
	maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
	<br/><br/>
	
	CreatedTime:<%= session.getCreationTime() %>
	<br/><br/>
	
	lastAccessedTime: <%= session.getLastAccessedTime() %>
	<br/><br/>
	
	ByeBye: <%= session.getAttribute("username") %>
	<br/><br/>
	
	<%
		//注銷session
		session.invalidate();
	%>
	
	<a href="login.jsp">重新登錄</a>
	

How to run code

  1. 將代碼clone到本地,使用eclipse導入代碼,導入的時候項目的類型選擇"git project"。
  2. 右鍵項目 run on Server。

法二: 將項目中WebContent中的內容拷入你的Tomccat服務器下的webapps目錄下你建的站點名,
然后啟動tomcat服務器,
在瀏覽器中輸入: http://localhost:8080/站點名,即可訪問

站點頁面展示

login頁面

loginSuccess頁面

loginOut頁面

項目文件結構截圖

疑問聯系

個人博客:http://blog.tommyyang.cn
個人郵箱:tingzai.yang@gmail.comJavaWeb Session詳解

代碼地址如下:
http://www.demodashi.com/demo/12756.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM