一.會(huì)話技術(shù)
1.1.什么是會(huì)話?
會(huì)話: 為了實(shí)現(xiàn)某一個(gè)功能, 客戶端和服務(wù)器之間可能會(huì)產(chǎn)生多次的請求和響應(yīng), 從客戶端訪問服務(wù)器開始, 到最后訪問服務(wù)器結(jié)束, 客戶端關(guān)閉為止, 這期間產(chǎn)生的多次請求和響應(yīng)加在一起就稱之為是客戶端和服務(wù)器之間的一次會(huì)話
1.2.如何來保存會(huì)話過程中產(chǎn)生的數(shù)據(jù)?
~requset域太小
~ServletContext域太大
二.Cookie
2.1.Cookie概述
Cookie的原理是通過Set-Cookie響應(yīng)頭和Cookie請求頭將會(huì)話中產(chǎn)生的數(shù)據(jù)保存在客戶端
客戶端請求服務(wù)器, 服務(wù)器將需要保存的數(shù)據(jù)通過Set-Cookie響應(yīng)頭發(fā)給客戶端, 客戶端收到后會(huì)將數(shù)據(jù)保存在瀏覽器的內(nèi)部
當(dāng)客戶端再次請求服務(wù)器時(shí), 通過Cookie請求頭將上次保存的數(shù)據(jù)再帶給服務(wù)器, 服務(wù)器通過Cookie頭來獲取數(shù)據(jù), 通過這種方式可以保存會(huì)話中產(chǎn)生的數(shù)據(jù).
Cookie是將需要保存的數(shù)據(jù)保存在了客戶端, 是客戶端技術(shù). 每個(gè)客戶端各自保存各自的數(shù)據(jù), 再次訪問服務(wù)器時(shí)會(huì)帶著自己的數(shù)據(jù), 每個(gè)客戶端持有自己的數(shù)據(jù), 因此就不會(huì)發(fā)生混亂了
2.2.實(shí)現(xiàn)Cookie
SUN公司為了簡化Cookie的開發(fā), 提供了如下操作Cookie的API:
1.創(chuàng)建Cookie
Cookie cookie = new Cookie(String name, String value);
getName()
getvalue()
setValue()
2.添加Cookie
response.addCookie();
//向響應(yīng)中添加一個(gè)Cookie, 可以在一次響應(yīng)中添加多個(gè)Cookie
3.獲取Cookie
Cookie [] cs = requset.getCookies();
//返回請求中所有Cookie組成的數(shù)組, 如果請求中沒有任何Cookie信息, 則返回null.
4.設(shè)置Cookie存活時(shí)間
setMaxAge();//指定Cookie保存的時(shí)間, 以秒為單位
//如果不明確的指定, Cookie默認(rèn)是會(huì)話級別的Cookie, Cookie會(huì)保存在瀏覽器的內(nèi)存中, 一旦瀏覽器關(guān)閉, Cookie也會(huì)隨著瀏覽器內(nèi)存的釋放而銷毀.
//通過setMaxAge()方法可以設(shè)置Cookie的存活時(shí)間, 設(shè)置了存活時(shí)間后, Cookie將會(huì)以文件的形式保存在瀏覽器的臨時(shí)文件夾中, 在指定的時(shí)間到來之前, 即使多次開關(guān)瀏覽器, Cookie信息也會(huì)一直存在.
5.設(shè)置Cookie路徑
setPath(String path);
//設(shè)置當(dāng)前Cookie在瀏覽器訪問哪一個(gè)路徑及其子孫路徑的時(shí)候帶回來
//如果不指定, 默認(rèn)的path值就是發(fā)送Cookie的Servlet的所在的路徑
6.設(shè)置domain(不推薦設(shè)置)
setDomain(xxx);
設(shè)置瀏覽器訪問哪一個(gè)域名時(shí)帶著當(dāng)前Cookie
現(xiàn)在的瀏覽器一般都拒絕接受第三方的Cookie, 甚至有的瀏覽器只要發(fā)現(xiàn)Cookie被設(shè)置了domain, 不管是不是第三方Cookie, 也會(huì)拒絕接受! 所以最好不要設(shè)置這個(gè)方法!
7.刪除Cookie
沒有直接刪除Cookie的方法!!!
如果想要?jiǎng)h除一個(gè)Cookie, 可以向?yàn)g覽器發(fā)送一個(gè) 同名 同path 同domain的Cookie, 只需要將Cookie的maxAge設(shè)置為0, 由于瀏覽器是根據(jù) 名+path+domain 來區(qū)分Cookie的, 所以當(dāng)兩個(gè)cookie的上述條件相同時(shí), 瀏覽器就會(huì)認(rèn)為是同一個(gè)Cookie, 那么后發(fā)的Cookie會(huì)覆蓋之前的, 而后發(fā)的Cookie的存活時(shí)間為0, 所以瀏覽器收到后也會(huì)立即刪除!!
8.Cookie的細(xì)節(jié):
一個(gè)Cookie只能標(biāo)識一種信息,它至少含有一個(gè)標(biāo)識該信息的名稱(NAME)和設(shè)置值(VALUE)。
一個(gè)WEB站點(diǎn)可以給一個(gè)WEB瀏覽器發(fā)送多個(gè)Cookie,一個(gè)WEB瀏覽器也可以存儲(chǔ)多個(gè)WEB站點(diǎn)提供的Cookie。
瀏覽器一般只允許存放300個(gè)Cookie,每個(gè)站點(diǎn)最多存放20個(gè)Cookie,每個(gè)Cookie的大小限制為4KB。
三.Session
3.1.Session概述
Session是將會(huì)話中產(chǎn)生的數(shù)據(jù)保存在了服務(wù)器端, 是服務(wù)器端技術(shù)
Session是一個(gè)域?qū)ο?br>
setAttribute(String name, Object value);
getAttribute(String name);
removeAttribute(String name)
getAttributeNames()
生命周期:
當(dāng)?shù)谝淮握{(diào)用request.getSession()方法時(shí)創(chuàng)建Session
超時(shí):
如果一個(gè)Session超時(shí)30分鐘(可以在web.xml中來修改, 在根目錄下通過<session-config>來配置)未被使用, 則認(rèn)為Session超時(shí), 銷毀session
自殺:
當(dāng)調(diào)用session.invalidate()方法的時(shí)session立即銷毀!!
意外身亡:
當(dāng)服務(wù)器非正常關(guān)閉時(shí), 隨著應(yīng)用的銷毀, session銷毀. 當(dāng)服務(wù)器正常關(guān)閉, 則未超時(shí)的session將會(huì)以文件的形式保存在tomcat服務(wù)器work目錄下, 這個(gè)過程叫做session的鈍化. 當(dāng)服務(wù)器再次啟動(dòng)時(shí), 鈍化著的session還可以恢復(fù)過來, 這個(gè)過程叫做session的活化。
作用范圍:
當(dāng)前會(huì)話范圍
主要功能:
保存當(dāng)前會(huì)話相關(guān)的數(shù)據(jù)
3.2.Session的原理
Session是基于一個(gè)JSESSIOINID的Cookie工作的
怎么解決瀏覽器關(guān)閉之后, 無法使用瀏覽器關(guān)閉之前的Session??
(注意: 在訪問一個(gè)jsp時(shí), 默認(rèn)一上來就會(huì)創(chuàng)建session!!)
禁用Cookie的情況下使用Session
URL重寫: 就是在傳入的URL地址后拼接JSESSIOINID返回一個(gè)新的地址, 用來在禁用Cookie的情況下用url地址來攜帶JSESSIOINID
response.encodeURL(String url);
//--如果是普通的地址用這個(gè)方法
response.encodeRedirectURL(String url);
//--如果地址是用來進(jìn)行重定向的,用這個(gè)方法
四.Cookie和Session的比較:
(1) Cookie是將會(huì)話中產(chǎn)生的數(shù)據(jù)保存在客戶端, 是客戶端的技術(shù)
(2) Session是將會(huì)話中產(chǎn)生的數(shù)據(jù)保存在服務(wù)器端, 是服務(wù)器端的技術(shù)
(3) Cookie保存的信息的時(shí)間比較長, 但是安全性不高. 可能隨著用戶的操作, Cookie會(huì)被清空, 所以Cookie存儲(chǔ)數(shù)據(jù)的穩(wěn)定性比較差. 因此Cookie適合存放要保存時(shí)間較長, 但安全性要求不高的信息
(4) Session通常保存信息的時(shí)間比較有限, 但安全性比較高, 因?yàn)槭潜4嬖诜?wù)器端, 不會(huì)隨著用戶的操作而導(dǎo)致Session意外丟失, 因此session適合存放安全性要求比較高, 但是不需要長時(shí)間保存的數(shù)據(jù).