九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Cookie、Session、Token那點(diǎn)事兒

作者:騎小豬看流星

鏈接:https://www.jianshu.com/p/bd1be47a16c1


前言:新公司項(xiàng)目中使用到了Cookie,在各大Android技術(shù)討論群向前輩們?nèi)〗?jīng)討論這cookie、session、token這仨哥們的時(shí)候,很多開發(fā)者說法不一各抒已見,所以是時(shí)候回顧下http基礎(chǔ)以及總結(jié)開發(fā)經(jīng)驗(yàn)了。本文重在科普分析Cookie、Session、Token的基本概念和應(yīng)用場景;Okhttp框架下對Cookie的管理使用。文章如果寫的不好請各位開發(fā)者老司機(jī)私聊或者在評論區(qū)指點(diǎn)提出issue。


1
什么是Cookie?


 Cookie 技術(shù)產(chǎn)生源于 HTTP 協(xié)議在互聯(lián)網(wǎng)上的急速發(fā)展。隨著互聯(lián)網(wǎng)時(shí)代的策馬奔騰,帶寬等限制不存在了,人們需要更復(fù)雜的互聯(lián)網(wǎng)交互活動,就必須同服務(wù)器保持活動狀態(tài)(簡稱:保活)。


于是,在瀏覽器發(fā)展初期,為了適應(yīng)用戶的需求技術(shù)上推出了各種保持 Web 瀏覽狀態(tài)的手段,其中就包括了 Cookie 技術(shù)。Cookie 在計(jì)算機(jī)中是個(gè)存儲在瀏覽器目錄中的文本文件,當(dāng)瀏覽器運(yùn)行時(shí),存儲在 RAM 中發(fā)揮作用 (此種 Cookies 稱作 Session Cookies),一旦用戶從該網(wǎng)站或服務(wù)器退出,Cookie 可存儲在用戶本地的硬盤上 (此種 Cookies 稱作 Persistent Cookies)。


Cookie 起源:1993 年,網(wǎng)景公司雇員 Lou Montulli 為了讓用戶在訪問某網(wǎng)站時(shí),進(jìn)一步提高訪問速度,同時(shí)也為了進(jìn)一步實(shí)現(xiàn)個(gè)人化網(wǎng)絡(luò),發(fā)明了今天廣泛使用的 Cookie。(所以,適當(dāng)?shù)耐祽幸矔龠M(jìn)人類計(jì)算機(jī)發(fā)展史的一小步~)


Cookie時(shí)效性:目前有些 Cookie 是臨時(shí)的,有些則是持續(xù)的。臨時(shí)的 Cookie 只在瀏覽器上保存一段規(guī)定的時(shí)間,一旦超過規(guī)定的時(shí)間,該 Cookie 就會被系統(tǒng)清除。


Cookie使用限制:Cookie 必須在 HTML 文件的內(nèi)容輸出之前設(shè)置;不同的瀏覽器 (Netscape Navigator、Internet Explorer) 對 Cookie 的處理不一致,使用時(shí)一定要考慮;客戶端用戶如果設(shè)置禁止 Cookie,則 Cookie 不能建立。 并且在客戶端,一個(gè)瀏覽器能創(chuàng)建的 Cookie 數(shù)量最多為 300 個(gè),并且每個(gè)不能超過 4KB,每個(gè) Web 站點(diǎn)能設(shè)置的 Cookie 總數(shù)不能超過 20 個(gè)。


執(zhí)行流程:


A:首先,客戶端會發(fā)送一個(gè)http請求到服務(wù)器端。

B: 服務(wù)器端接受客戶端請求后,發(fā)送一個(gè)http響應(yīng)到客戶端,這個(gè)響應(yīng)頭,其中就包含Set-Cookie頭部。 

C:在客戶端發(fā)起的第二次請求(注意:如果服務(wù)器需要我們帶上Cookie,我們就需要在B步驟上面拿到這個(gè)Cookie然后作為請求頭一起發(fā)起第二次請求),提供給了服務(wù)器端可以用來唯一標(biāo)識客戶端身份的信息。這時(shí),服務(wù)器端也就可以判斷客戶端是否啟用了cookies。盡管,用戶可能在和應(yīng)用程序交互的過程中突然禁用cookies的使用,但是,這個(gè)情況基本是不太可能發(fā)生的,所以可以不加以考慮,這在實(shí)踐中也被證明是對的。


為了方便理解,可以先看下這張流程執(zhí)行圖加深概念



那么,在瀏覽器上面的請求頭和Cookie在那?下圖給大家截取了其中一種。



那么,上面都是談瀏覽器上的Cookie,那么在Android開發(fā)中,我們該如何去管理和使用Cookie?


Okhttp作為經(jīng)典到爆的網(wǎng)絡(luò)框架,它的API(本文是基于Okhttp3.0版本以上,3.0以下的版本API有所不同)是通過OkhttpClient中的CookieJar或者攔截器去管理Cookie的。理論上,我們只需在構(gòu)建單例OkhttpClient的時(shí)候,設(shè)置cookiejar或者攔截器,然后具體的操作(具體的操作也就是保存Cookie,取Cookie),Okhttp框架就會幫我們自動管理Cookie。


如下圖:



這是其中一種通過集合的增查特性,就可以簡單有效的幫我們管理Cookie。但我們還是要通過源代碼去一探究竟。首先,CookieJar是一個(gè)接口。



英文注釋翻譯過來就是(對應(yīng)段落翻譯):

CookieJar這個(gè)接口為HTTP cookies提供了強(qiáng)大的支持和相關(guān)策略。


這種策略的實(shí)現(xiàn)作用會負(fù)責(zé)選擇接受和拒絕那些cookie。一個(gè)合理的策略是拒絕所有的cookie,盡管這樣會干擾需要cookie的基于會話的自身身份驗(yàn)證方案。


作為Cookie的持久性,該接口的實(shí)現(xiàn)也必須要提供Cookie的存儲。一種簡單的實(shí)現(xiàn)可以將cookie存儲在內(nèi)存中;復(fù)雜的系統(tǒng)可以使用文件系統(tǒng)用于保存已接受的cookie的數(shù)據(jù)庫。這里的鏈接https://tools.ietf.org/html/rfc6265 指定cookie存儲模型更新和過期的cookie的策略。


所以,Okhttp的源碼告知我們可以將cookie存儲在內(nèi)存中;復(fù)雜的系統(tǒng)可以使用文件系統(tǒng)用于保存已接受的cookie的數(shù)據(jù)庫。因此,我們就可以通過Map去簡單的管理和使用。

繼續(xù)分析CookieJar接口里面的方法,依舊上源碼



里面有方法一個(gè)是saveFromResponse(HttpUrl url, List cookies)、loadForRequest(HttpUrl url)


saveFromResponse方法翻譯:根據(jù)這個(gè)jar的方法,可以將cookie從一個(gè)HTTP響應(yīng)保存到這里。


請注意,如果響應(yīng),此方法可能被稱為第二次HTTP響應(yīng),包括一個(gè)追蹤。對于這個(gè)隱蔽的HTTP特性,這里的cookie只包含其追蹤的cookie。簡單點(diǎn)理解就是如果我們使用了這個(gè)方法,就會進(jìn)行追蹤(說白了就是客戶端請求成功以后,在響應(yīng)頭里面去存cookie)


loadForRequest方法翻譯:將cookie從這個(gè)方法加載到一個(gè)HTTP請求到指定的url。這個(gè)方法從網(wǎng)絡(luò)上返回的結(jié)果可能是一個(gè)空集合。簡單的實(shí)現(xiàn)將返回尚未過期的已接受的cookie去進(jìn)行匹配。(說白了就是加載url的時(shí)候在請求頭帶上cookie)。



這樣,我們通過以上代碼就可以完成了Cookie的非持久化。什么,非持久化,這又是神馬?


繼續(xù)給大家科普,在上面說道,Cookie是具有時(shí)效性的,所以,Cookie的管理又分為持久化Cookie和非持久化Cookie。非持久化Cookie存儲在內(nèi)存中,也就意味著,其生命周期基本和app保持一致,app關(guān)閉后,Cookie丟失。而持久化Cookie則是存儲在本地磁盤中,app關(guān)閉后不丟失。那么,如果我們要使用Cookie的持久化策略,思想可以參考上面的非持久化策略,只需要將存儲方式改一下即可:


A:通過響應(yīng)攔截器從response取出cookie并保存到本地,通過請求攔截器從本地取出cookie并添加到請求中

B:自定義CookieJar,在saveFromResponse()中保存cookie到本地,在loadForRequest()從本地取出cookie。


那么在這里主要介紹如何通過Okhttp逼格值較高的攔截器去進(jìn)行持久化cookie操作。


保存cookie攔截器-1


保存cookie攔截器-2


這個(gè)SaveCookiesInterceptor攔截器的實(shí)現(xiàn),是首先從response獲取set-cookie字段的值,然后通過SharedPreferences保存在本地。


將Cookie添加到請求頭


AddCookiesInterceptor請求攔截器,這個(gè)攔截的作用就是判斷如果該請求存在cookie,則為其添加到Header的Cookie中。


寫好這兩個(gè)攔截器之后,我們只需要將實(shí)例對象放進(jìn)OkhttpClient里面即可快速的完成Cookie持久化操作。(PS:這兩個(gè)攔截器在同步Cookie的時(shí)候也是超級好用)


Okhttp使用cookie攔截器


拓展:如何通過客戶端的cookie與H5上面的cookie進(jìn)行同步,給大家推薦這一篇文章

客戶端與H5同步Cookie

https://www.jianshu.com/p/88084a66c256


2
Session


Session是對于服務(wù)端來說的,客戶端是沒有Session一說的。Session是服務(wù)器在和客戶端建立連接時(shí)添加客戶端連接標(biāo)志,最終會在服務(wù)器軟件(Apache、Tomcat、JBoss)轉(zhuǎn)化為一個(gè)臨時(shí)Cookie發(fā)送給給客戶端,當(dāng)客戶端第一請求時(shí)服務(wù)器會檢查是否攜帶了這個(gè)Session(臨時(shí)Cookie),如果沒有則會添加Session,如果有就拿出這個(gè)Session來做相關(guān)操作。


在這里引用別人家的一個(gè)小故事來加深印象:


在說session是啥之前,我們先來說說為什么會出現(xiàn)session會話,它出現(xiàn)的機(jī)理是什么?


我們知道,我們用瀏覽器打開一個(gè)網(wǎng)頁,用到的是HTTP協(xié)議,了解計(jì)算機(jī)的應(yīng)該都知道這個(gè)協(xié)議,它是無狀態(tài)的,什么是無狀態(tài)呢?就是說這一次請求和上一次請求是沒有任何關(guān)系的,互不認(rèn)識的,沒有關(guān)聯(lián)的。但是這種無狀態(tài)的的好處是快速。所以就會帶來一個(gè)問題就是,我希望幾個(gè)請求的頁面要有關(guān)聯(lián),比如:我在www.a.com/login.php里面登陸了,我在www.a.com/index.php 也希望是登陸狀態(tài),但是,這是2個(gè)不同的頁面,也就是2個(gè)不同的HTTP請求,這2個(gè)HTTP請求是無狀態(tài)的,也就是無關(guān)聯(lián)的,所以無法單純的在index.php中讀取到它在login.php中已經(jīng)登陸了!


 那咋搞呢?我不可能這2個(gè)頁面我都去登陸一遍吧?;蛘哂帽糠椒ㄟ@2個(gè)頁面都去查詢數(shù)據(jù)庫,如果有登陸狀態(tài),就判斷是登陸的了。這種查詢數(shù)據(jù)庫的方案雖然可行,但是每次都要去查詢數(shù)據(jù)庫不是個(gè)事,會造成數(shù)據(jù)庫的壓力。 所以正是這種訴求,這個(gè)時(shí)候,一個(gè)新的客戶端存儲數(shù)據(jù)方式出現(xiàn)了:cookie。cookie是把少量的信息存儲在用戶自己的電腦上,它在一個(gè)域名下是一個(gè)全局的,只要設(shè)置它的存儲路徑在域名www.a.com下 ,那么當(dāng)用戶用瀏覽器訪問時(shí),php就可以從這個(gè)域名的任意頁面讀取cookie中的信息。所以就很好的解決了我在www.a.com/login.php頁面登陸了,我也可以在www.a.com/index.php獲取到這個(gè)登陸信息了。


同時(shí)又不用反復(fù)去查詢數(shù)據(jù)庫。 雖然這種方案很不錯(cuò),也很快速方便,但是由于cookie 是存在用戶端,而且它本身存儲的尺寸大小也有限,最關(guān)鍵是用戶可以是可見的,并可以隨意的修改,很不安全。那如何又要安全,又可以方便的全局讀取信息呢?于是,這個(gè)時(shí)候,一種新的存儲會話機(jī)制:session 誕生了。

 Session 就是在一次會話中解決2次HTTP的請求的關(guān)聯(lián),讓它們產(chǎn)生聯(lián)系,讓2兩個(gè)頁面都能讀取到找個(gè)這個(gè)全局的session信息。session信息存在于服務(wù)器端,所以也就很好的解決了安全問題。


3
Token


token是用戶身份的驗(yàn)證方式,我們通常叫它:令牌。最簡單的token組成:uid(用戶唯一的身份標(biāo)識)、time(當(dāng)前時(shí)間的時(shí)間戳)、sign(簽名,由token的前幾位 鹽以哈希算法壓縮成一定長的十六進(jìn)制字符串,可以防止惡意第三方拼接token請求服務(wù)器)。還可以把不變的參數(shù)也放進(jìn)token,避免多次查庫。


應(yīng)用場景:


A:當(dāng)用戶首次登錄成功(注冊也是一種可以適用的場景)之后, 服務(wù)器端就會生成一個(gè) token 值,這個(gè)值,會在服務(wù)器保存token值(保存在數(shù)據(jù)庫中),再將這個(gè)token值返回給客戶端.

B:客戶端拿到 token 值之后,進(jìn)行本地保存。(SP存儲是大家能夠比較支持和易于理解操作的存儲)

C:當(dāng)客戶端再次發(fā)送網(wǎng)絡(luò)請求(一般不是登錄請求)的時(shí)候,就會將這個(gè) token 值附帶到參數(shù)中發(fā)送給服務(wù)器.

D:服務(wù)器接收到客戶端的請求之后,會取出token值與保存在本地(數(shù)據(jù)庫)中的token值做對比


對比一:如果兩個(gè) token 值相同, 說明用戶登錄成功過!當(dāng)前用戶處于登錄狀態(tài)!

對比二:如果沒有這個(gè) token 值, 則說明沒有登錄成功.

對比三:如果 token 值不同: 說明原來的登錄信息已經(jīng)失效,讓用戶重新登錄.


Cookie和Session的區(qū)別:


1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。

2、cookie不是很安全,別人可以分析存放在本地的cookie并進(jìn)行cookie欺騙,考慮到安全應(yīng)當(dāng)使用session。

3、session會在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會比較占用你服務(wù)器的性能,考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用cookie。

4、單個(gè)cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。

5、所以個(gè)人建議:

將登陸信息等重要信息存放為session

其他信息如果需要保留,可以放在cookie中


Token 和 Session 的區(qū)別:


session和 token并不矛盾,作為身份認(rèn)證token安全性比session好,因?yàn)槊總€(gè)請求都有簽名還能防止監(jiān)聽以及重放攻擊,而session就必須靠鏈路層來保障通訊安全了。如上所說,如果你需要實(shí)現(xiàn)有狀態(tài)的會話,仍然可以增加session來在服務(wù)器端保存一些狀態(tài)。


App通常用restful api跟server打交道。Rest是stateless的,也就是app不需要像browser那樣用cookie來保存session,因此用session token來標(biāo)示自己就夠了,session/state由api server的邏輯處理。如果你的后端不是stateless的rest api,那么你可能需要在app里保存session.可以在app里嵌入webkit,用一個(gè)隱藏的browser來管理cookie session.


Session是一種HTTP存儲機(jī)制,目的是為無狀態(tài)的HTTP提供的持久機(jī)制。所謂Session認(rèn)證只是簡單的把User信息存儲到Session里,因?yàn)镾ID的不可預(yù)測性,暫且認(rèn)為是安全的。這是一種認(rèn)證手段。而Token,如果指的是OAuth Token或類似的機(jī)制的話,提供的是 認(rèn)證 和 授權(quán) ,認(rèn)證是針對用戶,授權(quán)是針對App。其目的是讓 某App有權(quán)利訪問 某用戶 的信息。這里的Token是唯一的。不可以轉(zhuǎn)移到其它App上,也不可以轉(zhuǎn)到其它 用戶 上。轉(zhuǎn)過來說Session。Session只提供一種簡單的認(rèn)證,即有此SID,即認(rèn)為有此User的全部權(quán)利。是需要嚴(yán)格保密的,這個(gè)數(shù)據(jù)應(yīng)該只保存在站方,不應(yīng)該共享給其它網(wǎng)站或者第三方App。所以簡單來說,如果你的用戶數(shù)據(jù)可能需要和第三方共享,或者允許第三方調(diào)用API接口,用Token。如果永遠(yuǎn)只是自己的網(wǎng)站,自己的App,用什么就無所謂了。


token就是令牌,比如你授權(quán)(登錄)一個(gè)程序時(shí),他就是個(gè)依據(jù),判斷你是否已經(jīng)授權(quán)該軟件;cookie就是寫在客戶端的一個(gè)txt文件,里面包括你登錄信息之類的,這樣你下次在登錄某個(gè)網(wǎng)站,就會自動調(diào)用cookie自動登錄用戶名;session和cookie差不多,只是session是寫在服務(wù)器端的文件,也需要在客戶端寫入cookie文件,但是文件里是你的瀏覽器編號.Session的狀態(tài)是存儲在服務(wù)器端,客戶端只有session id;而Token的狀態(tài)是存儲在客戶端。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
來,科普一下JWT
基于token與基于服務(wù)器的身份認(rèn)證
Token,Cookie、Session傻傻分不清楚?
Cookie、Session、Token的區(qū)別
接口的鑒權(quán)cookie、session和token
用了這么久,token和session的區(qū)別,你真的清楚了嗎?
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服