本博客為原創:綜合 尚硅谷(http://www.atguigu.com)的系統教程(深表感謝)和 網絡上的現有資源(博客,文檔,圖書等),資源的出處我會標明
本博客的目的:①總結自己的學習過程,相當於學習筆記 ②將自己的經驗分享給大家,相互學習,互相交流,不可商用
內容難免出現問題,歡迎指正,交流,探討,可以留言,也可以通過以下方式聯系。
本人互聯網技術愛好者,互聯網技術發燒友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.定義:session在Web開發環境下,它的含義是指一類用來在客戶端與服務器端之間保持狀態的解決方案。有時候Session也用來指這種解決方案的存儲結構。
2.session機制
1)session機制采用的是在服務器端保持 HTTP 狀態信息的方案
2)服務器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息
3)當程序需要為某個客戶端的請求創建一個session時,服務器首先檢查這個客戶端的請求里是否包含了一個session標識(即sessionId)。
如果已經包含一個sessionId則說明以前已經為此客戶創建過session,服務器就按照session id把這個session檢索出來使用(如果檢索不到,可能會新建一個,這種情況可能出現在服務端已經刪除了該用戶對應的session對象,但用戶人為地在請求的URL后面附加上一個JSESSION的參數)。
如果客戶請求不包含sessionId,則為此客戶創建一個session並且生成一個與此session相關聯的sessionId,這個session id將在本次響應中返回給客戶端保存。
3.保存session id的幾種方式
1)保存session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規則把這個標識發送給服務器。
2)由於cookie可以被人為的禁用,必須有其它的機制以便在cookie被禁用時仍然能夠把session id傳遞回服務器,經常采用的一種技術叫做URL重寫,就是把session id附加在URL路徑的后面,附加的方式也有兩種:
一種是作為URL路徑的附加信息;
一種是作為查詢字符串附加在URL后面;
網絡在整個交互過程中始終保持狀態,就必須在每個客戶端可能請求的路徑后面都包含這個session id;
4.Session cookie
1)session通過SessionID來區分不同的客戶, session是以cookie或URL重寫為基礎的。默認使用cookie來實現,系統會創造一個名為JSESSIONID的輸出cookie,這稱之為session cookie,以區別persistent cookies(也就是我們通常所說的cookie),session cookie是存儲於瀏覽器內存中的,並不是寫到硬盤上的,通常看不到JSESSIONID,但是當把瀏覽器的cookie禁止后,web服務器會采用URL重寫的方式傳遞;
2)session cookie針對某一次會話而言,會話結束session cookie也就隨着消失了,而persistent cookie只是存在於客戶端硬盤上的一段文本;
3)關閉瀏覽器,只會是瀏覽器端內存里的session cookie消失,但不會使保存在服務器端的session對象消失,同樣也不會使已經保存到硬盤上的持久化cookie消失。
5.HttpSession 的聲明周期
1).什么時候創建 HttpSession 對象
① 對於JSP:是否瀏覽器訪問服務器端的任何一個JSP, 服務器都會立即創建一個 HttpSession 對象呢?不一定。
> 若當前的 JSP 是客戶端訪問的當前 WEB 應用的第一個資源,且 JSP 的 page 指定的 session 屬性值為 false,
則服務器就不會為 JSP 創建一個 HttpSession 對象;
> 若當前 JSP 不是客戶端訪問的當前 WEB 應用的第一個資源,且其他頁面已經創建一個 HttpSession 對象,
則服務器也不會為當前的JSP 頁面創建一個HttpSession 對象,而會把和當前會話相關聯的那個HttpSession 對象返回給當前的JSP 頁面;
② 對於Servlet:若Servlet 是客戶端訪問的第一個WEB 應用的資源,
則只有調用了request.getSession() 或者 request.getSession(true) 才會創建 HttpSession 對象
2).page指令中的 session=“false“ 到底表示什么意思?
> 當前 JSP 頁面禁用 session 隱含變量!但可以使用其他的顯式的 HttpSession 對象
如:HttpServlet session = request.getSession(false);
3).在Servlet 中如何獲取HttpSession 對象?
> request.getSession(boolean create):
若參數為 false, 則 若沒有和當前JSP 頁面關聯的HttpSession 對象,則返回 null , 若有 則返回 關聯的 HttpSession 對象
若參數為 true, 一定返回一個HttpSession 對象,若沒有和當前JSP 頁面關聯的HttpSession 對象,則服務器創建一個新的HttpSession 對象,若有,直接返回關聯的HttpSession對象
> request.getSession():等同於 request.getSession(true)
4).什么時候銷毀HttpSession 對象
① 直接調用HttpSession 的invalidate() 方法,使當前的HttpSession 對象失效。即,以后每次刷新頁面就會重新創建一個HttpSessioin 對象
② 服務器卸載了當前的 WEB 應用
③ 超出HttpSession 的過期時間: 以秒為單位
>session.setMaxInactiveInterval(interval) //設置 session 過期的時間 ,默認是 30分鍾
>session.getMaxInactiveInterval(); //獲取 sesson 過期時間
> 在web.xml 文件中設置HttpSession 的過期時間 : 單位為分鍾。在$TOMECAT_HOME/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
④ 並不是關閉了瀏覽器就銷毀了HttpSession:url重寫,持久化cookie
5).利用URL重寫實現Session跟蹤
① Servlet規范中引入了一種補充的會話管理機制,它允許不支持Cookie的瀏覽器也可以與WEB服務器保持連續的會話。
這種補充機制要求在響應消息的實體內容中必須包含下一次請求的超鏈接,並將會話標識號作為超鏈接的URL地址的一個特殊參數
② 將會話標識號以參數形式附加在超鏈接的URL地址后面的技術稱為URL重寫。
如果在瀏覽器不支持Cookie或者關閉了Cookie功能的情況下,WEB服務器還要能夠與瀏覽器實現有狀態的會話,就必須對所有可能被客戶端訪問的請求路徑(包括超鏈接、form表單的action屬性設置和重定向的URL)進行URL重寫
HttpServletResponse接口中定義了兩個用於完成URL重寫方法: encodeURL方法 encodeRedirectURL方法
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>session login JSP</title> 8 </head> 9 <body> 10 11 SessionId :<%= session.getId() %> 12 <br><br> 13 14 IsNew:<%= session.isNew() %> 15 <br><br> 16 17 MaxInactiveInterval:<%= session.getMaxInactiveInterval() %> 18 <br><br> 19 20 CreateTime:<%= session.getCreationTime() %> 21 <br><br> 22 23 LastAccessTime:<%= session.getLastAccessedTime() %> 24 <br><br> 25 <% 26 Object username = session.getAttribute("username"); 27 if(username == null){ 28 username = ""; 29 } 30 %> 31 32 <form action="<% response.encodeURL("login.jsp") %>" method="post"> 33 34 username:<input type="text" name="username" value="<%= username %>"/> 35 <input type="submit" value="submit"/> 36 </form> 37 38 </body> 39 </html>
6.Session的創建與刪除
1)一個常見的錯誤是以為session在有客戶端訪問時就被創建,然而事實是直到某server端程序(如Servlet)調用HttpServletRequest.getSession(true) 或者 HttpServletRequest.getSession()這樣的語句時才會被創建
2)session在下列情況下被刪除:
① 程序調用HttpSession.invalidate()
② 距離上一次收到客戶端發送的session id時間間隔超過了session的最大有效時間
③ 服務器進程被停止
3)關閉瀏覽器只會使存儲在客戶端瀏覽器內存中的session cookie失效,不會使服務器端的session對象失效