Session與Cookie底層原理
學習目錄
1.會話入門
2.cookie
3.session
4.自定義快取
5.自定義Token
6.表單重複提交(Http重複提交)
一、會話管理入門
1.2、軟體中的會話
開啟瀏覽器 -> 瀏覽商品列表 -> 加入購物車(把商品資訊儲存下來) -> 關閉瀏覽器
開啟瀏覽器-> 直接進入購物車 -> 檢視到上次加入購物車的商品 -> 下訂單 -> 支付
在購物會話過程中,如何儲存商品資訊暱?
會話管理:管理瀏覽器客戶端
域物件: 實現資源之間的資料共享。
request域物件:一定要使用轉發技術來跳轉頁面
context域物件:context是所有使用者公有的資源會覆蓋資料
解決辦法: 可以使用session域物件來儲存會話資料
1.3、會話技術
Cookie技術:會話資料儲存在瀏覽器客戶端。
Session技術:會話資料儲存在伺服器端。
二、cookie
2.1、cookie特點:會話資料儲存在瀏覽器客戶端。
2.2、cookie技術核心
cookie類:用於儲存會話資料
1)構造Cookie物件
new Cookie(java.lang.Stringname, java.lang.String value)
2)設定cookie
void setPath(java.lang.String uri) :設定cookie的有效訪問路徑
void setMaxAge(int expiry) : 設定cookie的有效時間
void setValue(java.lang.String newValue) :設定cookie的值
3)傳送cookie到瀏覽器端儲存
void response.addCookie(Cookie cookie) : 傳送cookie
4)伺服器接收cookie
Cookie[] cookies =request.getCookies() : 接收cookie
2.3:cookie原理
1)伺服器建立cookie物件,把會話資料儲存到cookie物件中。
new Cookie("name","value");
2) 伺服器傳送cookie資訊到瀏覽器
response.addCookie(cookie);
舉例: set-cookie:name=eric (隱藏傳送了一個set-cookie名稱的響應頭)
3)瀏覽器得到伺服器傳送的cookie,然後儲存在瀏覽器端。
4)瀏覽器在下次訪問伺服器時,會帶著cookie資訊
舉例: cookie: name=eric (隱藏帶著一個叫cookie名稱的請求頭)
5)伺服器接收到瀏覽器帶來的cookie資訊
request.getCookies();
2.4:cookie的細節
1)void setPath(java.lang.String uri) :設定cookie的有效訪問路徑。有效路徑指的是cookie的有效路徑儲存在哪裡,那麼瀏 覽器在有效路徑下訪問伺服器時就會帶著cookie資訊,否則不帶cookie資訊。
2)void setMaxAge(int expiry) : 設定cookie的有效時間。
正整數:表示cookie資料儲存瀏覽器的快取目錄(硬碟中),數值表示儲存的時間。
負整數:表示cookie資料儲存瀏覽器的記憶體中。瀏覽器關閉cookie就丟失了!!
零:表示刪除同名的cookie資料
3)Cookie資料型別只能儲存非中文字串型別的。可以儲存多個cookie,但是瀏覽器一般只允許存放300個Cookie,每個站點 最多存放20個Cookie,每個Cookie的大小限制為4KB。
2.5、案例-顯示使用者上次訪問時間
三、session
3.1、使用session的優勢
經過上面瞭解到cookie的侷限
1)Cookie只能存字串型別。不能儲存物件
2)只能存非中文。
3)1個Cookie的容量不超過4KB。
如果用想存非字串、超過4kb內容 那就得用我們接下的主角 session啦。session的特點:會話存在伺服器記憶體中
3.2、session核心
HttpSession類:用於儲存會話資料
1)建立或得到session物件
HttpSession getSession()
HttpSession getSession(booleancreate)
2)設定session物件
void setMaxInactiveInterval(intinterval) :設定session的有效時間
void invalidate() :銷燬session物件
java.lang.String getId() :得到session編號
3)儲存會話資料到session物件
void setAttribute(java.lang.Stringname, java.lang.Object value) :儲存資料
java.lang.ObjectgetAttribute(java.lang.String name) :獲取資料
voidremoveAttribute(java.lang.String name) :清除資料
3.3、session原理
1)第一次訪問建立session物件,給session物件分配一個唯一的ID,叫JSESSIONID
newHttpSession();
2)把JSESSIONID作為Cookie的值傳送給瀏覽器儲存
Cookiecookie = new Cookie("JSESSIONID", sessionID);
response.addCookie(cookie);
3)第二次訪問的時候,瀏覽器帶著JSESSIONID的cookie訪問伺服器
4)伺服器得到JSESSIONID,在伺服器的記憶體中搜索是否存放對應編號的session物件。
if(找到){
returnmap.get(sessionID);
}
Map<String,HttpSession>]
<"s001",s1>
<"s001,"s2>
5)如果找到對應編號的session物件,直接返回該物件
6)如果找不到對應編號的session物件,建立新的session物件,繼續走1的流程
結論:通過JSESSION的cookie值在伺服器找session物件!!!!!
3.4、session細節
1)java.lang.String getId() :得到session編號
2)兩個getSession方法:getSession(true)/ getSession() : 建立或得到session物件。沒有匹配的session編號自動建立新的 session物件。
getSession(false): 得到session物件。沒有匹配的session編號,返回null
3)void setMaxInactiveInterval(int interval) : 設定session的有效時間
session物件銷燬時間:
3.1預設情況30分伺服器自動回收
3.2修改session回收時間
3.3全域性修改session有效時間
案例 建立和獲取session
建立session
注意 當你瀏覽器關閉session Id會被清空掉
session的實現原理 服務端返回sessionId給客戶端儲存 客戶端通過本地SessionId請求 查詢伺服器儲存的sessionId
四、自定義快取
五、自定義Token
5.1、什麼是token ?
token是一個令牌,具有隨機性,類似於sessionId。在對接一些第三方平臺的時候,為了能夠保證資料安全性,通常會使用一些令牌進行互動
5.2、 如何自定義token
token生成規則,只要保證token生成一個不重複的唯一字串即可,使用jdk自帶的uuid生成規則。
5.3、什麼是uuid
UUID含義是通用唯一識別碼 (Universally Unique Identifier),這是一個軟體建構的標準,也是被開源軟體基金會 (Open Software Foundation, OSF) 的組織應用在分散式計算環境 (Distributed ComputingEnvironment, DCE) 領域的一部分。
UUID 的目的,是讓分散式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人衝突的 UUID。
5.4、使用UUDID生成Token
String tokenId=UUID.randomUUID().toString();
六、表單重複提交(Http重複提交)
6.1、產生表單重複提交的原因:網路延遲、重新重新整理、點選網頁回退到之前頁面繼續提交
6.2、解決方式
1)使用JavaScript
缺點:使用者重新重新整理還是會出現重複提交
2)、使用伺服器提交解決
具體的做法:在伺服器端生成一個唯一的隨機標識號,專業術語稱為Token(令牌),同時在當前使用者的Session域中儲存這個Token。然後將Token傳送到客戶端的Form表單中,在Form表單中使用隱藏域來儲存這個Token,表單提交的時候連同這個Token一起提交到伺服器端,然後在伺服器端判斷客戶端提交上來的Token與伺服器端生成的Token是否一致,如果不一致,那就是重複提交了,此時伺服器端就可以不處理重複提交的表單。如果相同則處理表單提交,處理完後清除當前使用者的Session域中儲存的標識號。
轉發程式碼