一汞舱、Session
Session是什么伍纫?
Session實(shí)際上是一個(gè)特定的時(shí)間概念,Web中的Session指的就是用戶在瀏覽某個(gè)網(wǎng)站時(shí)昂芜,從進(jìn)入網(wǎng)站到關(guān)閉這個(gè)網(wǎng)站所經(jīng)過(guò)的這段時(shí)間莹规,也就是用戶瀏覽這個(gè)網(wǎng)站所花費(fèi)的時(shí)間。
Session代表服務(wù)器與瀏覽器的一次會(huì)話過(guò)程泌神,這個(gè)過(guò)程是連續(xù)的良漱,也可以時(shí)斷時(shí)續(xù)的
Session的創(chuàng)建
當(dāng)JSP頁(yè)面沒(méi)有顯式禁止session的時(shí)候舞虱,在打開(kāi)瀏覽器第一次請(qǐng)求該jsp的時(shí)候,服務(wù)器會(huì)自動(dòng)為其創(chuàng)建一個(gè)session母市,并賦予其一個(gè)sessionID矾兜,發(fā)送給客戶端的瀏覽器。以后客戶端接著請(qǐng)求本應(yīng)用中其他資源的時(shí)候患久,會(huì)自動(dòng)在請(qǐng)求頭上添加:
Cookie:JSESSIONID=客戶端第一次拿到的session ID
這樣椅寺,服務(wù)器端在接到請(qǐng)求時(shí)候,就會(huì)收到session ID蒋失,并根據(jù)ID在內(nèi)存中找到之前創(chuàng)建的session對(duì)象返帕,提供給請(qǐng)求使用。
Session的刪除
(1)Session超時(shí):超時(shí)指的是連續(xù)一定時(shí)間服務(wù)器沒(méi)有收到該Session所對(duì)應(yīng)客戶端的請(qǐng)求高镐,并且這個(gè)時(shí)間超過(guò)了服務(wù)器設(shè)置的Session超時(shí)的最大時(shí)間
(2)程序調(diào)用HttpSession.invalidate()
(3)服務(wù)器關(guān)閉或服務(wù)停止
Session的存放
服務(wù)器端的內(nèi)存中溉旋。不過(guò)session可以通過(guò)特殊的方式做持久化管理。
session是一個(gè)容器嫉髓,可以存放會(huì)話過(guò)程中的任何對(duì)象。
二邑闲、Cookies
Cookies要解決的問(wèn)題
有些開(kāi)發(fā)者借助請(qǐng)求中的ip頭部來(lái)唯一標(biāo)識(shí)發(fā)出此次請(qǐng)求的客戶端算行,但是這種方式存在很多問(wèn)題。因?yàn)樯凰剩行┯脩羰峭ㄟ^(guò)代理來(lái)訪問(wèn)的州邢,比如用戶A通過(guò)代理B連接網(wǎng)站www.example.com, 服務(wù)器端獲取的ip信息是代理B分配給A的ip地址,如果用戶這時(shí)斷開(kāi)代理褪子,然后再次連接代理的話量淌,它的代理ip地址又再次改變,也就說(shuō)一個(gè)用戶對(duì)應(yīng)了多個(gè)ip地址嫌褪,這種情況下呀枢,服務(wù)器端根據(jù)ip地址來(lái)標(biāo)識(shí)用戶的話,會(huì)認(rèn)為請(qǐng)求是來(lái)自不同的用戶笼痛,事實(shí)上是同一個(gè)用戶裙秋。 還用另外一種情況就是,比如很多用戶是在同一個(gè)局域網(wǎng)里通過(guò)路由連接互聯(lián)網(wǎng)缨伊,然后都訪問(wèn)www.example.com的話摘刑,由于這些用戶共享同一個(gè)外網(wǎng)ip地址,這會(huì)導(dǎo)致服務(wù)器認(rèn)為這些用戶是同一個(gè)用戶發(fā)出的請(qǐng)求刻坊,因?yàn)樗麄兪莵?lái)自同一個(gè)ip地址的訪問(wèn)枷恕。
保持應(yīng)用程序狀態(tài)的第一步就是要知道如何來(lái)唯一地標(biāo)識(shí)每個(gè)客戶端。因?yàn)橹挥性趆ttp中請(qǐng)求中攜帶的信息才能用來(lái)標(biāo)識(shí)客戶端谭胚,所以在請(qǐng)求中必須包含某種可以用來(lái)標(biāo)識(shí)客戶端唯一身份的信息徐块。Cookie設(shè)計(jì)出來(lái)就是用來(lái)解決這一問(wèn)題的未玻。
Token
既然我們可以檢查User-Agent這個(gè)頭部來(lái)加強(qiáng)安全性,那么不妨再利用其它的一些頭部信息蛹锰,把他們組合起來(lái)生成一個(gè)加密的token深胳,并且讓客戶端在后續(xù)的請(qǐng)求中攜帶這個(gè)token!這樣的話,攻擊者基本上不可能猜測(cè)出這樣一個(gè)token是怎么生成出來(lái)的铜犬。這好比你用信用卡在超市付款舞终,一個(gè)你必須有信用卡(好比session id),另外你也必須輸入一個(gè)支付密碼(好比token),這有這兩者都符合的情況下癣猾,你才能成功進(jìn)入賬號(hào)付款敛劝。