對于初學(xué)者來說,對Token和Session的使用難免會限于困境吩抓,開發(fā)過程中知道有這個(gè)東西涉茧,但卻不知道為什么要用他?更不知道其原理疹娶,今天我就帶大家一起分析分析這東西伴栓。
我們先解釋一下他的含義:
1、Token的引入:Token是在客戶端頻繁向服務(wù)端請求數(shù)據(jù)雨饺,服務(wù)端頻繁的去數(shù)據(jù)庫查詢用戶名和密碼并進(jìn)行對比钳垮,判斷用戶名和密碼正確與否,并作出相應(yīng)提示额港,在這樣的背景下饺窿,Token便應(yīng)運(yùn)而生。
2移斩、Token的定義:Token是服務(wù)端生成的一串字符串肚医,以作客戶端進(jìn)行請求的一個(gè)令牌,當(dāng)?shù)谝淮蔚卿浐笙虼桑?wù)器生成一個(gè)Token便將此Token返回給客戶端肠套,以后客戶端只需帶上這個(gè)Token前來請求數(shù)據(jù)即可,無需再次帶上用戶名和密碼猖任。
3你稚、使用Token的目的:Token的目的是為了減輕服務(wù)器的壓力,減少頻繁的查詢數(shù)據(jù)庫,使服務(wù)器更加健壯入宦。
了解了Token的意義后哺徊,我們就更明確的知道為什么要用他了。
如何使用Token乾闰?
這是本文的重點(diǎn)落追,在這里我就介紹常用的兩種方式。
1涯肩、用設(shè)備號/設(shè)備mac地址作為Token(推薦)
客戶端:客戶端在登錄的時(shí)候獲取設(shè)備的設(shè)備號/mac地址轿钠,并將其作為參數(shù)傳遞到服務(wù)端。
服務(wù)端:服務(wù)端接收到該參數(shù)后病苗,便用一個(gè)變量來接收同時(shí)將其作為Token保存在數(shù)據(jù)庫疗垛,并將該Token設(shè)置到session中,客戶端每次請求的時(shí)候都要統(tǒng)一攔截硫朦,并將客戶端傳遞的token和服務(wù)器端session中的token進(jìn)行對比贷腕,如果相同則放行,不同則拒絕咬展。
分析:此刻客戶端和服務(wù)器端就統(tǒng)一了一個(gè)唯一的標(biāo)識Token泽裳,而且保證了每一個(gè)設(shè)備擁有了一個(gè)唯一的會話。該方法的缺點(diǎn)是客戶端需要帶設(shè)備號/mac地址作為參數(shù)傳遞破婆,而且服務(wù)器端還需要保存涮总;優(yōu)點(diǎn)是客戶端不需重新登錄,只要登錄一次以后一直可以使用祷舀,至于超時(shí)的問題是有服務(wù)器這邊來處理瀑梗,如何處理?若服務(wù)器的Token超時(shí)后裳扯,服務(wù)器只需將客戶端傳遞的Token向數(shù)據(jù)庫中查詢抛丽,同時(shí)并賦值給變量Token,如此嚎朽,Token的超時(shí)又重新計(jì)時(shí)铺纽。
2、用session值作為Token
客戶端:客戶端只需攜帶用戶名和密碼登陸即可哟忍。
客戶端:客戶端接收到用戶名和密碼后并判斷,如果正確了就將本地獲取sessionID作為Token返回給客戶端陷寝,客戶端以后只需帶上請求數(shù)據(jù)即可锅很。
分析:這種方式使用的好處是方便,不用存儲數(shù)據(jù)凤跑,但是缺點(diǎn)就是當(dāng)session過期后,客戶端必須重新登錄才能進(jìn)行訪問數(shù)據(jù)。
使用過程中出現(xiàn)的問題以及解決方案宠叼?
剛才我們輕松介紹了Token的兩種使用方式,但是在使用過程中我們還出現(xiàn)各種問題褐奥,Token第一種方法中我們隱藏了一個(gè)在網(wǎng)絡(luò)不好或者并發(fā)請求時(shí)會導(dǎo)致多次重復(fù)提交數(shù)據(jù)的問題。
該問題的解決方案:將session和Token套用翘簇,如此便可解決撬码,如何套用呢?請看這段解釋:
這就是解決重復(fù)提交的方案版保。
總結(jié):以上是個(gè)人對開發(fā)中使用Token和session的一點(diǎn)總結(jié)呜笑,如有敘述不當(dāng)之處請指正,我將及時(shí)改正并感謝彻犁,我知道還有更多更好的使用方式叫胁,我在這里只是拋磚引玉,希望大家將您的使用方式提出來汞幢,我們一起討論驼鹅,學(xué)習(xí),一起進(jìn)步森篷,同時(shí)也為像我一樣對這方面理解薄弱的朋友提供點(diǎn)幫助输钩,謝謝。
本文在開源項(xiàng)目:https://github.com/Android-Alvin/Android-LearningNotes 中已收錄疾宏,里面包含不同方向的自學(xué)編程路線张足、面試題集合/面經(jīng)、及系列技術(shù)文章等坎藐,資源持續(xù)更新中...