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