Session的API:
HttpSession接口
- 創建或得到Session對象
HttpSession getSession()
HttpSession getSession(boolean create)
- session對象操作會話數據(域對象)
void setAttribute(java.lang.String name, java.lang.Object value) 保存數據
java.lang.Object getAttribute(java.lang.String name) 得到數據
void removeAttribute(java.lang.String name) 清除數據
- 設置session對象
void setMaxInactiveInterval(int interval) 設置session有效時長
java.lang.String getId() 得到session對象編號
void invalidate() 銷毀session對象
猜測Session原理:
問題: 服務器如何識別不同的瀏覽器客戶端???
前提: 取出數據的session和保存數據的session對象應該是同一個session對象
瀏覽器1(標記001):把會話數據保存到session對象中
HttpSession session = request.getSession(); (session對象:標記001)
session.setAttribute("name", "rose");
瀏覽器1(標記001): 從session對象取出會話數據
(服務器得到標記001,在服務器內存中搜索是否存在001標記的session對象)
HttpSession session = request.getSession(); (是)
String name = (String)session.getAttribute("name"); (可以得到)
瀏覽器1(新窗口)(標記001):從session對象取出會話數據
HttpSession session = request.getSession(); (是)
String name = (String)session.getAttribute("name"); (可以得到)
瀏覽器2(沒有標記001):從session對象取出會話數據
HttpSession session = request.getSession(); (不是)
String name = (String)session.getAttribute("name"); (不能取出)
新的瀏覽器1(沒有標記001):從session對象取出會話數據
HttpSession session = request.getSession(); (不是)
String name = (String)session.getAttribute("name"); (不能取出)
Session原理:
- 服務器創建Session對象,分配一個唯一的標記(JSESSIONID),會話數據保存sessino對象中,然后服務器把JSESSION作為cookie發送給瀏覽器保存
響應頭: JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E - 瀏覽器得到JSESSIONID的cookie,保存在瀏覽器的目錄中
- 瀏覽器在下次訪問服務器時,帶著JSESSIONID的cookie數據訪問服務器。
請求頭:Cookie: JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E - 服務器得到JSESSIONID,在服務器內存中查詢是否存在對應的編號的session對象。
- 如果找到對應的session對象,返回這個對象
- 如果找不到對應的session對象,有可能返回null,也有可能是創建新的session對象。
Session細節:
- 得到session對象編號: getId() 得到JSESSION的cookie值。
- 設置session有效時長:
注意: 關閉瀏覽器不會導致session對象銷毀!!
2.1 默認時間: 30分鐘后,服務器自動回收session對象。(最后一次訪問session開始計算)
2.2 代碼設置session的有效時長:
void setMaxInactiveInterval(int interval) 以秒為單位
2.3 全局設置session的有效時長:
在web.xml文件中,設置
<!-- 配置session的有效時長:以分為單位 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
2.4 立即手動銷毀session對象:invalidate()
request.getSession()方法
HttpSession getSession()/getSession(true) 創建或得到session對象。當前沒有找到對應的session 對象,創建新的session對象
HttpSession getSession(false) 得到session對象。如果找不到,則返回null默認情況下,JSESSSOIN的cookie保存在瀏覽器內存,如果要保存到硬盤。
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(100000);
response.addCookie(cookie);