標籤:項目 語義 time 作者 lock 兩種 匯入 基本 ida
代碼地址如下:
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的幾種儲存方式
使用Cookie: 儲存session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識發送給伺服器,這種cookie稱為session cookie。
如:
URL重寫: 由於cookie可以被人為的禁用,必須有其它的機制以便在cookie被禁用時仍然能夠把session id傳遞迴伺服器,
經常採用的一種技術叫做URL重寫,就是把session id附加在URL路徑的後面,附加的方式也有兩種,一種是作為URL路徑的附加資訊,
另一種是作為查詢字串附加在URL後面。網路在整個互動過程中始終保持狀態,就必須在每個用戶端可能請求的路徑後面都包含這個session id。
如:
Session的建立與刪除
- Session建立
(1). 對於Jsp: 若當前頁面為瀏覽器(用戶端)訪問web應用的第一個資源頁面且Jsp的Page指定的Session屬性的值為true。
(2). 對於Servlet: 若當前Servlet為瀏覽器(用戶端)訪問web應用的第一個資源時,使用request.getSession()或request.getSession(true)建立。
- 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
- 將代碼clone到本地,使用eclipse匯入代碼,匯入的時候項目的類型選擇"git project"。
- 右鍵項目 run on Server。
法二: 將項目中WebContent中的內容拷入你的Tomccat伺服器下的webapps目錄下你建的網站名,
然後啟動tomcat伺服器,
在瀏覽器中輸入: http://localhost:8080/網站名,即可訪問
網站頁面展示login頁面
loginSuccess頁面
loginOut頁面
專案檔結構
疑問聯絡
個人部落格:http://blog.tommyyang.cn
個人郵箱:[email protected] Session詳解
代碼地址如下:
http://www.demodashi.com/demo/12756.html
註:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權
JavaWeb Session詳解