Java Web学习(五)session、cookie、token
一、引言
動態網頁興起后,會話管理變成開發者需要考慮的一個問題,由于HTTP請求是無狀態的,為了區分每個用戶,此時引入了會話標識(session id)的概念,但是存儲機制也會產生不同的問題,下面就詳細分析一下三種機制的優缺點以及使用方式。
二、session
定義:會話,打開web應用時產生,瀏覽器第一次訪問服務器會在服務器端生成一個session,有一個sessionid和它對應。
創建:session在訪問tomcat服務器時調用HttpServletRequest.getSession(true)創建。(此時對應的sessionid也同時產生)
存儲:session的狀態信息等儲存在服務器的內存中,但是sessionid是保存客戶端的cookie中,客戶端不保存session,session銷毀只能通過invalidate或超時失效,關掉瀏覽器并不會關閉session。
刪除:(1)超時;
? ?(2)程序調用HttpSession.invalidate();
? ?(3)程序關閉;
存在的問題:(1)負載均衡后,每臺機器間的session都需要相互復制,很煩雜
(2)單獨把session拿出來存,又會面臨這臺存session的服務器一宕機,全部的用戶都得重新登陸,涼涼...
常見QA:
Q:瀏覽器關閉時,session會同時關閉么?
A:session并不會因為瀏覽器的關閉而刪除!關閉瀏覽器和session失效沒有任何關系, session本身有一個存活時間,在tomcat中默認的是30分鐘,打個比方即使瀏覽器一直開著,如果在30分鐘內沒有發出任何請求, 那原來存在服務器上的session域內的東西就全沒有了, 再次訪問的時候,服務器會新建一個session。它的改變是通過session.getMaxInactiveInterval()改變的,當關閉瀏覽器,再打開瀏覽器訪問的時候,服務器會新建一個session,可以通過session的ID來判斷是不是新的session,session的失效除了上述的超時,還有調用invalidate() 或者服務器重啟或者中斷,所以如果當設置session的MaxInactiveInterval為-1(永不超時)時,并且關閉了瀏覽器,那么你的session會一直存在,除非重啟服務器。
?三、cookie
定義:由服務器生成,發送給瀏覽器,瀏覽器把cookie以kv形式保存到本地某個目錄下的文本文件內,下一次請求同一網站時會把該cookie發送給服務器。
存儲:保存在本地客戶端。
刪除:(1)超時;(設置了過期時間,cookie過期后會存儲在硬盤里面)
? ? (2)手動刪除;
存在的問題:(1)cookie不是很安全,別人可以分析存放在本地的cookie并進行cookie欺騙。
(2)cookie有安全隱患,通過攔截或本地文件找得到你的cookie后可以進行攻擊。
(3)cookie有大小限制以及瀏覽器在存cookie的個數也有限制。
四、token
定義:令牌,是一種用戶身份的驗證方式。
創建:第一次登錄后,服務器生成一個Token便將此Token返回給客戶端
存儲:token一般儲存在客戶端的cookie中,服務端生成后不保存token(可以存在緩存中),服務端處理每次請求,只做token的校驗工作而已。
常見組成方式:uid(用戶唯一的身份標識) +?time(當前時間的時間戳) +?sign(簽名,由token的前幾位+鹽以哈希算法壓縮成一定長的十六進制字符串,可以防止惡意第三方拼接token請求服務器)。
驗證流程:(1)用戶通過用戶名和密碼發送請求。
(2)程序驗證。
(3)程序返回一個簽名的token 給客戶端。
(4)客戶端儲存token,并且每次用于每次發送請求。
(5)再次請求時,服務端驗證token并返回數據。
PS:第一次登陸時,客戶端傳賬號和密碼到服務器,服務器先去查詢數據庫,查詢到用戶信息后服務器再根據自己的規則生成token并緩存(如redis等技術),再把token回傳給客戶端(客戶端可以把token存到cookie中)。
? 第二次登陸時,直接傳token給服務器驗證緩存中是否存在該token;也可以傳賬號密碼給服務器,讓服務器再次生成一次token,用這次生成的token去緩存中校驗是否存在。
轉載于:https://www.cnblogs.com/riches/p/11399123.html
總結
以上是生活随笔為你收集整理的Java Web学习(五)session、cookie、token的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces Round #58
- 下一篇: Java Web学习(六)HttpSer