引言##
什么是會(huì)話
簡(jiǎn)單來說,用戶打開瀏覽器 -> 訪問一些服務(wù)器內(nèi)容 -> 關(guān)閉瀏覽器,這一操作,稱之為一次會(huì)話過程。
會(huì)話管理的目的
管理瀏覽器客戶端和服務(wù)器端之間會(huì)話過程中產(chǎn)生的會(huì)話數(shù)據(jù)。
會(huì)話技術(shù)
Cookie技術(shù):會(huì)話數(shù)據(jù)保存在瀏覽器客戶端。
Session技術(shù):會(huì)話數(shù)據(jù)保存在服務(wù)器端。
Cookie技術(shù)##
特點(diǎn)
會(huì)話數(shù)據(jù)保存在瀏覽器客戶端。
常用方法
1)構(gòu)造Cookie對(duì)象
Cookie(java.lang.String name, java.lang.String value)
2)設(shè)置cookie
void setPath(java.lang.String uri) :設(shè)置cookie的有效訪問路徑
void setMaxAge(int expiry) : 設(shè)置cookie的有效時(shí)間
void setValue(java.lang.String newValue) :設(shè)置cookie的值
3)發(fā)送cookie到瀏覽器端保存
void response.addCookie(Cookie cookie) : 發(fā)送cookie
4)服務(wù)器接收cookie
Cookie[] request.getCookies() : 接收cookie
3.3 Cookie原理
1)服務(wù)器創(chuàng)建cookie對(duì)象,把會(huì)話數(shù)據(jù)存儲(chǔ)到cookie對(duì)象中。
new Cookie("name","value");
2)服務(wù)器發(fā)送cookie信息到瀏覽器
response.addCookie(cookie);
舉例:set-cookie: name=eric (隱藏發(fā)送了一個(gè)set-cookie名稱的響應(yīng)頭)
3)瀏覽器得到服務(wù)器發(fā)送的cookie,然后保存在瀏覽器端。
4)瀏覽器在下次訪問服務(wù)器時(shí),會(huì)帶著cookie信息
舉例:cookie: name=eric (隱藏帶著一個(gè)叫cookie名稱的請(qǐng)求頭)
5)服務(wù)器接收到瀏覽器帶來的cookie信息
request.getCookies();
Cookie的細(xì)節(jié)
1)void setPath(java.lang.String uri) :設(shè)置cookie的有效訪問路徑。
有效路徑指的是cookie的有效路徑保存在哪里,那么瀏覽器在有效路徑下訪問服務(wù)器時(shí)就會(huì)帶著cookie信息,否則不帶cookie信息。
2)void setMaxAge(int expiry) : 設(shè)置cookie的有效時(shí)間。
正整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的緩存目錄(硬盤中),數(shù)值表示保存的時(shí)間。
負(fù)整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的內(nèi)存中。瀏覽器關(guān)閉cookie就丟失了!!
零:表示刪除同名的cookie數(shù)據(jù)
3)Cookie數(shù)據(jù)類型只能保存非中文字符串類型的。可以保存多個(gè)cookie,但是瀏覽器一般只允許存放300個(gè)Cookie,每個(gè)站點(diǎn)最多存放20個(gè)Cookie,每個(gè)Cookie的大小限制為4KB。
session##
常用方法
1)創(chuàng)建或得到session對(duì)象
HttpSession getSession()
HttpSession getSession(boolean create)
2)設(shè)置session對(duì)象
void setMaxInactiveInterval(int interval) : 設(shè)置session的有效時(shí)間
void invalidate() : 銷毀session對(duì)象
java.lang.String getId() : 得到session編號(hào)
3)保存會(huì)話數(shù)據(jù)到session對(duì)象
void setAttribute(java.lang.String name, java.lang.Object value) : 保存數(shù)據(jù)
java.lang.Object getAttribute(java.lang.String name) : 獲取數(shù)據(jù)
void removeAttribute(java.lang.String name) : 清除數(shù)據(jù)
session原理
1)第一次訪問創(chuàng)建session對(duì)象,給session對(duì)象分配一個(gè)唯一的ID,叫JSESSIONID
2)把JSESSIONID作為Cookie的值發(fā)送給瀏覽器保存
3)第二次訪問的時(shí)候,瀏覽器帶著JSESSIONID的cookie訪問服務(wù)器
4)服務(wù)器得到JSESSIONID,在服務(wù)器的內(nèi)存中搜索是否存放對(duì)應(yīng)編號(hào)的session對(duì)象。
5)如果找到對(duì)應(yīng)編號(hào)的session對(duì)象,直接返回該對(duì)象
6)如果找不到對(duì)應(yīng)編號(hào)的session對(duì)象,創(chuàng)建新的session對(duì)象,繼續(xù)走1的流程
結(jié)論:通過JSESSION的cookie值在服務(wù)器找session對(duì)象!
Sesson細(xì)節(jié)
1)java.lang.String getId() : 得到session編號(hào)
2)兩個(gè)getSession方法:
getSession(true) / getSession() : 創(chuàng)建或得到session對(duì)象。
沒有匹配的session編號(hào),自動(dòng)創(chuàng)建新的session對(duì)象。
getSession(false):得到session對(duì)象。沒有匹配的session編號(hào),返回null
3)void setMaxInactiveInterval(int interval) : 設(shè)置session的有效時(shí)間,默認(rèn)情況30分服務(wù)器自動(dòng)回收
<!-- 修改session全局有效時(shí)間:分鐘 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
4)void invalidate() : 銷毀session對(duì)象
5)如何避免瀏覽器的JSESSIONID的cookie隨著瀏覽器關(guān)閉而丟失的問題
/*
手動(dòng)發(fā)送一個(gè)硬盤保存的cookie給瀏覽器
*/
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);