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