一次會話: 打開瀏覽器 -> 訪問一些服務器內容 -> 關閉瀏覽器
登錄場景:
打開瀏覽器 -> 瀏覽到登陸頁面 -> 輸入用戶名和密碼 -> 訪問到用戶主頁(顯示用戶名)
修改密碼(輸入原密碼)
修改收貨地址
.......
問題:在此處登錄會話過程中產生的數據(用戶會話數據)如何保存下來呢?
購物場景:
打開瀏覽器 -> 瀏覽商品列表 -> 加入購物車(把商品信息保存下來) -> 關閉瀏覽器
打開瀏覽器-> 直接進入購物車 -> 查看到上次加入購物車的商品 -> 下訂單 -> 支付
問題: 在購物會話過程中,如何保存商品信息??
會話管理: 管理瀏覽器客戶端 和 服務器端之間會話過程中產生的會話數據。
域對象: 實現資源之間的數據共享。
request域對象
context域對象
登錄場景:
小張: 輸入“張三” (保存數據: context.setAttribute("name","張三")) -> 用戶主頁(顯示“張三”)
小李: 輸入“李四”(保存數據:context.setAttribute("name","李四")) -> 用戶主頁(顯示“李四”)
問題: context是所有用戶公有的資源!!!會覆蓋數據。
小張: 輸入“張三”(保存數據: request.setAttribute("name","張三"))- > 用戶主頁(顯示“張三”) 問題: 一定要使用轉發技術來跳轉頁面!!!
解決辦法: 可以使用session域對象來保存會話數據!!!
Cookie技術:會話數據保存在瀏覽器客戶端。
Session技術:會話數據保存在服務器端。
Cookie技術:會話數據保存在瀏覽器客戶端。
Cookie類:用於存儲會話數據
1)構造Cookie對象
Cookie(java.lang.String name, java.lang.String value)
2)設置cookie
void setPath(java.lang.String uri) :設置cookie的有效訪問路徑
void setMaxAge(int expiry) : 設置cookie的有效時間
void setValue(java.lang.String newValue) :設置cookie的值
3)發送cookie到瀏覽器端保存
void response.addCookie(Cookie cookie) : 發送cookie
4)服務器接收cookie
Cookie[] request.getCookies() : 接收cookie
1)服務器創建cookie對象,把會話數據存儲到cookie對象中。
new Cookie("name","value");
2) 服務器發送cookie信息到瀏覽器
response.addCookie(cookie);
舉例: set-cookie: name=eric (隱藏發送了一個set-cookie名稱的響應頭)
3)瀏覽器得到服務器發送的cookie,然后保存在瀏覽器端。
4)瀏覽器在下次訪問服務器時,會帶着cookie信息
舉例: cookie: name=eric (隱藏帶着一個叫cookie名稱的請求頭)
5)服務器接收到瀏覽器帶來的cookie信息
request.getCookies();
1)void setPath(java.lang.String uri) :設置cookie的有效訪問路徑。有效路徑指的是cookie的有效路徑保存在哪里,那么瀏覽器在有效路徑下訪問服務器時就會帶着cookie信息,否則不帶cookie信息。
2)void setMaxAge(int expiry) : 設置cookie的有效時間。
正整數:表示cookie數據保存瀏覽器的緩存目錄(硬盤中),數值表示保存的時間。
負整數:表示cookie數據保存瀏覽器的內存中。瀏覽器關閉cookie就丟失了!!
零:表示刪除同名的cookie數據
3)Cookie數據類型只能保存非中文字符串類型的。可以保存多個cookie,但是瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個Cookie的大小限制為4KB。
Cookie的局限:
1)Cookie只能存字符串類型。不能保存對象
2)只能存非中文。
3)1個Cookie的容量不超過4KB。
如果要保存非字符串,超過4kb內容,只能使用session技術!!!
Session特點:
會話數據保存在服務器端。(內存中)
HttpSession類:用於保存會話數據
1)創建或得到session對象
HttpSession getSession()
HttpSession getSession(boolean create)
2)設置session對象
void setMaxInactiveInterval(int interval) : 設置session的有效時間
void invalidate() : 銷毀session對象
java.lang.String getId() : 得到session編號
3)保存會話數據到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域對象保存數據,就必須從哪個域對象取出!!!!
瀏覽器1:(給s1分配一個唯一的標記:s001,把s001發送給瀏覽器)
1)創建session對象,保存會話數據
HttpSession session = request.getSession(); --保存會話數據 s1
瀏覽器1 的新窗口(帶着s001的標記到服務器查詢,s001->s1,返回s1)
1)得到session對象的會話數據
HttpSession session = request.getSession(); --可以取出 s1
新的瀏覽器1:(沒有帶s001,不能返回s1)
1)得到session對象的會話數據
HttpSession session = request.getSession(); --不可以取出 s2
瀏覽器2:(沒有帶s001,不能返回s1)
1)得到session對象的會話數據
HttpSession session = request.getSession(); --不可以取出 s3
代碼解讀:HttpSession session = request.getSession();
1)第一次訪問創建session對象,給session對象分配一個唯一的ID,叫JSESSIONID
new HttpSession();
2)把JSESSIONID作為Cookie的值發送給瀏覽器保存
Cookie cookie = new Cookie("JSESSIONID", sessionID);
response.addCookie(cookie);
3)第二次訪問的時候,瀏覽器帶着JSESSIONID的cookie訪問服務器
4)服務器得到JSESSIONID,在服務器的內存中搜索是否存放對應編號的session對象。
if(找到){
return map.get(sessionID);
}
Map<String,HttpSession>]
<"s001", s1>
<"s001,"s2>
5)如果找到對應編號的session對象,直接返回該對象
6)如果找不到對應編號的session對象,創建新的session對象,繼續走1的流程
結論:通過JSESSION的cookie值在服務器找session對象!!!!!
1)java.lang.String getId() : 得到session編號
2)兩個getSession方法:
getSession(true) / getSession() : 創建或得到session對象。沒有匹配的session編號,自動創 建新的session對象。
getSession(false): 得到session對象。沒有匹配的session編號,返回null
3)void setMaxInactiveInterval(int interval) : 設置session的有效時間
session對象銷毀時間:
3.1 默認情況30分服務器自動回收
3.2 修改session回收時間
3.3 全局修改session有效時間
<!-- 修改session全局有效時間:分鍾 --> <session-config> <session-timeout>1</session-timeout> </session-config> |
3.4.手動銷毀session對象
void invalidate() : 銷毀session對象
4)如何避免瀏覽器的JSESSIONID的cookie隨着瀏覽器關閉而丟失的問題
/** * 手動發送一個硬盤保存的cookie給瀏覽器 */ Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c); |
總結:
1)會話管理: 瀏覽器和服務器會話過程中的產生的會話數據的管理。
2)Cookie技術:
new Cookie("name","value")
response.addCookie(coookie)
request.getCookies()
3)Session技術
request.getSession();
setAttrbute("name","會話數據");
getAttribute("會話數據")
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。