一、Session
Session是什么?
Session實際上是一個特定的時間概念,Web中的Session指的就是用戶在瀏覽某個網(wǎng)站時,從進入網(wǎng)站到關(guān)閉這個網(wǎng)站所經(jīng)過的這段時間,也就是用戶瀏覽這個網(wǎng)站所花費的時間。
Session代表服務(wù)器與瀏覽器的一次會話過程,這個過程是連續(xù)的,也可以時斷時續(xù)的
Session的創(chuàng)建
當(dāng)JSP頁面沒有顯式禁止session的時候,在打開瀏覽器第一次請求該jsp的時候,服務(wù)器會自動為其創(chuàng)建一個session,并賦予其一個sessionID,發(fā)送給客戶端的瀏覽器。以后客戶端接著請求本應(yīng)用中其他資源的時候,會自動在請求頭上添加:
Cookie:JSESSIONID=客戶端第一次拿到的session ID
這樣,服務(wù)器端在接到請求時候,就會收到session ID,并根據(jù)ID在內(nèi)存中找到之前創(chuàng)建的session對象,提供給請求使用。
Session的刪除
(1)Session超時:超時指的是連續(xù)一定時間服務(wù)器沒有收到該Session所對應(yīng)客戶端的請求,并且這個時間超過了服務(wù)器設(shè)置的Session超時的最大時間
(2)程序調(diào)用HttpSession.invalidate()
(3)服務(wù)器關(guān)閉或服務(wù)停止
Session的存放
服務(wù)器端的內(nèi)存中。不過session可以通過特殊的方式做持久化管理。
session是一個容器,可以存放會話過程中的任何對象。
二、Cookies
Cookies要解決的問題
有些開發(fā)者借助請求中的ip頭部來唯一標識發(fā)出此次請求的客戶端,但是這種方式存在很多問題。因為,有些用戶是通過代理來訪問的,比如用戶A通過代理B連接網(wǎng)站www.example.com, 服務(wù)器端獲取的ip信息是代理B分配給A的ip地址,如果用戶這時斷開代理,然后再次連接代理的話,它的代理ip地址又再次改變,也就說一個用戶對應(yīng)了多個ip地址,這種情況下,服務(wù)器端根據(jù)ip地址來標識用戶的話,會認為請求是來自不同的用戶,事實上是同一個用戶。 還用另外一種情況就是,比如很多用戶是在同一個局域網(wǎng)里通過路由連接互聯(lián)網(wǎng),然后都訪問www.example.com的話,由于這些用戶共享同一個外網(wǎng)ip地址,這會導(dǎo)致服務(wù)器認為這些用戶是同一個用戶發(fā)出的請求,因為他們是來自同一個ip地址的訪問。
保持應(yīng)用程序狀態(tài)的第一步就是要知道如何來唯一地標識每個客戶端。因為只有在http中請求中攜帶的信息才能用來標識客戶端,所以在請求中必須包含某種可以用來標識客戶端唯一身份的信息。Cookie設(shè)計出來就是用來解決這一問題的。
Token
既然我們可以檢查User-Agent這個頭部來加強安全性,那么不妨再利用其它的一些頭部信息,把他們組合起來生成一個加密的token,并且讓客戶端在后續(xù)的請求中攜帶這個token!這樣的話,攻擊者基本上不可能猜測出這樣一個token是怎么生成出來的。這好比你用信用卡在超市付款,一個你必須有信用卡(好比session id),另外你也必須輸入一個支付密碼(好比token),這有這兩者都符合的情況下,你才能成功進入賬號付款。