引入
Cookie的局限:
- 1)Cookie只能存字符串類型。不能保存對象
- 2)只能存非中文。
- 3)1個(gè)Cookie的容量不超過4KB。
如果要保存非字符串,超過4kb內(nèi)容,只能使用session技術(shù)!!!
Session特點(diǎn):** 會(huì)話數(shù)據(jù)保存在服務(wù)器端。(內(nèi)存中) **
Session技術(shù)核心
HttpSession類:用于保存會(huì)話數(shù)據(jù)
1)創(chuàng)建或得到session對象
HttpSession getSession()
HttpSession getSession(boolean create)
2)設(shè)置session對象
void setMaxInactiveInterval(int interval) : 設(shè)置session的有效時(shí)間
void invalidate() : 銷毀session對象
java.lang.String getId() : 得到session編號
3)保存會(huì)話數(shù)據(jù)到session對象
void setAttribute(String name, Object value) : 保存數(shù)據(jù)
Object getAttribute(String name) : 獲取數(shù)據(jù)
void removeAttribute(String name) : 清除數(shù)據(jù)
Session原理
問題: 服務(wù)器能夠識別不同的瀏覽者!!!
前提: 在哪個(gè)session域?qū)ο蟊4鏀?shù)據(jù),就必須從哪個(gè)域?qū)ο笕〕觯。。。?/p>
-
瀏覽器1:(給s1分配一個(gè)唯一的標(biāo)記:s001,把s001發(fā)送給瀏覽器)
- 1)創(chuàng)建session對象,保存會(huì)話數(shù)據(jù)
HttpSession session = request.getSession(); --保存會(huì)話數(shù)據(jù) s1
瀏覽器1 的新窗口(帶著s001的標(biāo)記到服務(wù)器查詢,s001->s1,返回s1) - 2)得到session對象的會(huì)話數(shù)據(jù)
HttpSession session = request.getSession(); --可以取出 s1
- 1)創(chuàng)建session對象,保存會(huì)話數(shù)據(jù)
-
新的瀏覽器1:(沒有帶s001,不能返回s1)
- 1)得到session對象的會(huì)話數(shù)據(jù)
HttpSession session = request.getSession(); --不可以取出 s2
- 1)得到session對象的會(huì)話數(shù)據(jù)
-
瀏覽器2:(沒有帶s001,不能返回s1)
- 1)得到session對象的會(huì)話數(shù)據(jù)
HttpSession session = request.getSession(); --不可以取出 s3
- 1)得到session對象的會(huì)話數(shù)據(jù)
代碼解讀:
** HttpSession session = request.getSession(); **
- 1)第一次訪問創(chuàng)建session對象,給session對象分配一個(gè)唯一的ID,叫JSESSIONID
new HttpSession();
-
2)把JSESSIONID作為Cookie的值發(fā)送給瀏覽器保存
Cookie cookie = new Cookie("JSESSIONID", sessionID); response.addCookie(cookie);
* 3)第二次訪問的時(shí)候,瀏覽器帶著JSESSIONID的cookie訪問服務(wù)器
* 4)服務(wù)器得到JSESSIONID,在服務(wù)器的內(nèi)存中搜索是否存放對應(yīng)編號的session對象。
if(找到){
return map.get(sessionID);
}
Map<String,HttpSession>]
<"s001", s1>
<"s001,"s2>
* 5)如果找到對應(yīng)編號的session對象,直接返回該對象
* 6)如果找不到對應(yīng)編號的session對象,創(chuàng)建新的session對象,繼續(xù)走1的流程
** 結(jié)論:通過JSESSION的cookie值在服務(wù)器找session對象!!!!! **
---
### Sesson細(xì)節(jié)
* 1)String getId() : 得到session編號 (相當(dāng)于key)
* 2)兩個(gè)getSession方法:
* getSession(true) / getSession() : 創(chuàng)建或得到session對象。沒有匹配的session編號,自動(dòng)創(chuàng) 建新的session對象。
* getSession(false): 得到session對象。沒有匹配的session編號,返回null
* 3)void setMaxInactiveInterval(int interval) : 設(shè)置session的有效時(shí)間
* session對象銷毀時(shí)間:
* 3.1 默認(rèn)情況30分服務(wù)器自動(dòng)回收
* 3.2 修改session回收時(shí)間
* 3.3 全局修改session有效時(shí)間
```
<!-- 修改session全局有效時(shí)間:分鐘 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
```
* 3.4.手動(dòng)銷毀session對象
void invalidate() : 銷毀session對象
* 4)如何避免瀏覽器的JSESSIONID的cookie隨著瀏覽器關(guān)閉而丟失的問題
// 手動(dòng)發(fā)送一個(gè)硬盤保存的cookie給瀏覽器
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
總結(jié):
* 1)會(huì)話管理: 瀏覽器和服務(wù)器會(huì)話過程中的產(chǎn)生的會(huì)話數(shù)據(jù)的管理。
* 2)Cookie技術(shù):
* new Cookie("name","value")
* response.addCookie(coookie)
* request.getCookies()
* 3)Session技術(shù)
* request.getSession();
* setAttrbute("name","會(huì)話數(shù)據(jù)");
* getAttribute("會(huì)話數(shù)據(jù)")