-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------html
1.定義:session在Web開發環境下,它的含義是指一類用來在客戶端與服務器端之間保持狀態的解決方案。有時候Session也用來指這種解決方案的存儲結構。java
2.session機制web
1)session機制採用的是在服務器端保持 HTTP 狀態信息的方案 瀏覽器
2)服務器使用一種相似於散列表的結構(也可能就是使用散列表)來保存信息服務器
3)當程序須要爲某個客戶端的請求建立一個session時,服務器首先檢查這個客戶端的請求裏是否包含了一個session標識(即sessionId)。cookie
若是已經包含一個sessionId則說明之前已經爲此客戶建立過session,服務器就按照session id把這個session檢索出來使用(若是檢索不到,可能會新建一個,這種狀況可能出如今服務端已經刪除了該用戶對應的session對象,但用戶人爲地在請求的URL後面附加上一個JSESSION的參數)。網絡
若是客戶請求不包含sessionId,則爲此客戶建立一個session而且生成一個與此session相關聯的sessionId,這個session id將在本次響應中返回給客戶端保存。session
3.保存session id的幾種方式jsp
1)保存session id的方式能夠採用cookie,這樣在交互過程當中瀏覽器能夠自動的按照規則把這個標識發送給服務器。post
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對象失效