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