如果客戶端禁止 cookie 能實(shí)現(xiàn) session 還能用嗎?
一般默認(rèn)情況下,在會話中,服務(wù)器存儲 session 的 sessionid 是通過 cookie 存在瀏覽器里的。
如果瀏覽器禁用了 cookie,瀏覽器請求服務(wù)器無法攜帶 sessionid,服務(wù)器無法識別請求中的用戶身份,session失效。
但可以通過其他方法在禁用 cookie 的情況下,可以繼續(xù)使用session。
通過url重寫,把 sessionid 作為參數(shù)追加的原 url 中,后續(xù)的瀏覽器與服務(wù)器交互中攜帶 sessionid 參數(shù)。
服務(wù)器的返回數(shù)據(jù)中包含 sessionid,瀏覽器發(fā)送請求時,攜帶 sessionid 參數(shù)。
通過 Http 協(xié)議其他 header 字段,服務(wù)器每次返回時設(shè)置該 header 字段信息,瀏覽器中 js 讀取該 header 字段,請求服務(wù)器時,js設(shè)置攜帶該 header 字段。
cookie、session、token 三者之間的關(guān)系
1. session機(jī)制
session是服務(wù)端存儲的一個對象,主要用來存儲所有訪問過該服務(wù)端的客戶端的用戶信息(也可以存儲其他信息),從而實(shí)現(xiàn)保持用戶會話狀態(tài)。但是服務(wù)器重啟時,內(nèi)存會被銷毀,存儲的用戶信息也就消失了。
不同的用戶訪問服務(wù)端的時候會在session對象中存儲鍵值對,“鍵”用來存儲開啟這個用戶信息的“鑰匙”,在登錄成功后,“鑰匙”通過cookie返回給客戶端,客戶端存儲為sessionId記錄在cookie中。當(dāng)客戶端再次訪問時,會默認(rèn)攜帶cookie中的sessionId來實(shí)現(xiàn)會話機(jī)制。
1.1 session是基于cookie的
cookie的數(shù)據(jù)4k左右;
cookie存儲數(shù)據(jù)的格式:字符串key=value
cookie存儲有效期:可以自行通過expires進(jìn)行具體的日期設(shè)置,如果沒設(shè)置,默認(rèn)是關(guān)閉瀏覽器時失效。
cookie有效范圍:當(dāng)前域名下有效。所以session這種會話存儲方式方式只適用于客戶端代碼和服務(wù)端代碼運(yùn)行在同一臺服務(wù)器上(前后端項(xiàng)目協(xié)議、域名、端口號都一致,即在一個項(xiàng)目下)
1.2 session的持久化
用于解決重啟服務(wù)器后session消失的問題。在數(shù)據(jù)庫中存儲session,而不是存儲在內(nèi)存中。通過包:express-mysql-session。
當(dāng)客戶端存儲的cookie失效后,服務(wù)端的session不會立即銷毀,會有一個延時,服務(wù)端會定期清理無效session,不會造成無效數(shù)據(jù)占用存儲空間的問題。
2. token機(jī)制
該機(jī)制適用于前后端分離的項(xiàng)目(前后端代碼運(yùn)行在不同的服務(wù)器下)。
請求登錄時,token和sessionid原理相同,是對key和key對應(yīng)的用戶信息進(jìn)行加密后的加密字符,登錄成功后,會在響應(yīng)主體中將{token:“字符串”}返回給客戶端。
客戶端通過cookie都可以進(jìn)行存儲。再次請求時不會默認(rèn)攜帶,需要在請求攔截器位置給請求頭中添加認(rèn)證字段Authorization攜帶token信息,服務(wù)器就可以通過token信息查找用戶登錄狀態(tài)。
session的工作原理?
當(dāng)客戶端登錄完成后,會在服務(wù)端產(chǎn)生一個session,此時服務(wù)端會將sessionid返回給客戶端瀏覽器??蛻舳藢essionid儲存在瀏覽器的cookie中,當(dāng)用戶再次登錄時,會獲得對應(yīng)的sessionid,然后將sessionid發(fā)送到服務(wù)端請求登錄,服務(wù)端在內(nèi)存中找到對應(yīng)的sessionid,完成登錄,如果找不到,返回登錄頁面。
更多關(guān)于“Java培訓(xùn)”的問題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓(xùn)經(jīng)驗(yàn),課程大綱更科學(xué)更專業(yè),有針對零基礎(chǔ)的就業(yè)班,有針對想提升技術(shù)的好程序員班,高品質(zhì)課程助力你實(shí)現(xiàn)java程序員夢想。