大家好残吩,我是IT修真院深圳分院第04期學員财忽,一枚正直善良的web程序員。
今天給大家分享一下泣侮,修真院官網(wǎng) js任務中可能會使用到的知識點:
登錄之后即彪,在其他頁面怎么判斷是否已經(jīng)登錄?
1.背景介紹
登錄功能活尊,是前端經(jīng)常要完成的需求之一隶校。但是如何進行登錄判斷?
2.知識剖析
傳統(tǒng)的Cookie-session驗證
Cookie認證機制就是為一次請求認證在服務端創(chuàng)建一個Session對象蛹锰,同時在客戶端的瀏覽器端創(chuàng)建了一個Cookie對象深胳; 通過客戶端帶上來Cookie對象來與服務器端的session對象匹配來實現(xiàn)狀態(tài)管理的。默認的铜犬,當我們關閉瀏覽器的時候舞终,cookie會被刪除。 但可以通過修改cookie 的expire time使cookie在一定時間內(nèi)有效癣猾。
所以敛劝,在其它頁面保持登錄,可以在登錄后往本地cookie中存儲一個關鍵字段(存儲用戶信息),如:名字纷宇、值夸盟、過期時間、路徑和域像捶。 在路由變化的時候上陕,或者在頁面跳轉的時候,檢測是該字段值是否正確作岖,不正確則跳轉登錄頁唆垃;點擊注銷可以執(zhí)行刪除。
token的驗證
token的意思是“令牌”痘儡,是用戶身份的驗證方式辕万,最簡單的token組成:uid(用戶唯一的身份標識)、time(當前時間的時間戳)、sign(簽名)渐尿, 由token的前幾位+鹽以哈希算法壓縮成一定長的十六進制字符串醉途,可以防止惡意第三方拼接token請求服務器)。還可以把不變的參數(shù)也放進token砖茸,避免多次查庫隘擎。
3.常見問題
cookie與session的區(qū)別
1、cookie數(shù)據(jù)存放在客戶端上凉夯,session數(shù)據(jù)放在服務器上货葬。
2、cookie不是很安全劲够,別人可以分析存放在本地的COOKIE并進行COOKIE欺騙考慮到安全應當使用session震桶。
3、session會在一定時間內(nèi)保存在服務器上征绎。當訪問增多蹲姐,會比較占用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE人柿。
4柴墩、單個cookie保存的數(shù)據(jù)不能超過4K。
5凫岖、所以個人建議:
將登陸信息等重要信息存放為SESSION
其他信息如果需要保留江咳,可以放在COOKIE中
cookie保存格式和參數(shù)說明
//設置Cookie
/*在cookie的名或值中不能使用分號(;)、逗號(,)隘截、等號(=)以及空格扎阶。在cookie
的名中做到這點很容易,但要保存的值是不確定的婶芭。如何來存儲這些值呢?方法是用
encodeURI()函數(shù)進行編碼着饥,它能將一些特殊符號使用十六進制表示犀农,例如空格將會編碼
為“20%”,從而可以存儲于cookie值中宰掉,而且使用此種方案還可以避免中文亂碼的出現(xiàn)呵哨。
在獲取cookie時可以通過decodeURI()方法對cookie進行解碼。
Cookie的保存格式為:"name=value; expires=evalue; path=pvalue;"每個屬性之間通過:'分號+空格'(; )隔開;
參數(shù)值的意思:
name:表示要存入對象的名稱轨奄,唯一必須設置(通常使用:user@domain格式命名孟害,user為本地用戶,domain為所訪問網(wǎng)站的域名)挪拟。value:表示要存入的值挨务。
expires:該對象的有效時間(可選)(默認為當前瀏覽器會話有用,關閉瀏覽器就消失);
path:指定該Cookie作用范圍(可選)(即:在那些網(wǎng)頁上可用);
domain:設置web服務器的Cookie共享域(可選)(如:test*.com)表示域名為test*.com
的服務器共享該Cookie
secure:設置Cookie的傳輸過程是否加密(可選)(一般為SSH加密)*/
4.解決方案
在前端瀏覽器里經(jīng)常使用Cookie-session驗證谎柄,那么如何進行使用這種驗證丁侄?
5.編碼實戰(zhàn)
6.擴展思考
SESSION與TOKEN的區(qū)別session和token并不矛盾,作為身份認證 token安全性比session好朝巫,因為每個請求都有簽名還能防止監(jiān)聽以及重放攻擊鸿摇,而session就必須靠鏈路層來保障通訊安全了。 如上所說,如果你需要實現(xiàn)有狀態(tài)的會話竟痰,仍然可以增加session來在服務器端保存一些狀態(tài)拍棕。App通常用restful api跟server打交道。Rest是stateless的筷黔,也就是app不需要像瀏覽器那樣用cookie來保存session,因此用session/token來標示自己就夠了, session/state由api server的邏輯處理变逃。 如果你的后端不是stateless的rest api, 那么你可能需要在app里保存session.可以在app里嵌入webkit,用一個隱藏的browser來管理cookie session.
Session 是一種HTTP存儲機制必逆,目的是為無狀態(tài)的HTTP提供的持久機制。所謂Session認證只是簡單的把User信息存儲到Session 里揽乱,因為SID 的不可預測性名眉,暫且認為是安全的。 這是一種認證手段凰棉。而Token损拢,如果指的是Token或類似的機制的話,提供的是認證和授權撒犀,認證是針對用戶福压,授權是針對App。其目的是讓某App有權利訪問某用戶的信息或舞。 這里的 Token是唯一的荆姆。不可以轉移到其它App上,也不可以轉到其它用戶上映凳。轉過來說Session只提供一種簡單的認證胆筒,即有此 SID,即認為有此User的全部權利诈豌。 是需要嚴格保密的仆救,這個數(shù)據(jù)應該只保存在站方,不應該共享給其它網(wǎng)站或者第三方App矫渔。 所以簡單來說彤蔽,如果你的用戶數(shù)據(jù)可能需要和第三方共享,或者允許第三方調(diào)用 API 接口庙洼,用Token顿痪。如果永遠只是自己的網(wǎng)站镊辕,自己的 App,用什么就無所謂了员魏。
7.參考文獻
參考二:js創(chuàng)建cookie js設置cookie過期時間
8.更多討論
1.和服務端seesion對接的數(shù)據(jù)一定要存儲在Cookie里嗎?
一般是存儲在Cookie里撕阎。雖然說瀏覽器的一個Cookie一般只有4KB,而現(xiàn)代瀏覽器localstorage和seesionstorge的存儲量更大受裹,但是Cookie可以靈活設置過期時間,而這一點localstorage和seesionstorge是做不到的虏束。
2.token通常用在什么地方棉饶?
token通常是用在跨平臺的項目,有移動端镇匀,PC端的項目照藻。因為IOS和安卓對Cookie的處理方法是不同,因此用token就可以方便各平臺使用汗侵。
3.如何手動取消登陸狀態(tài)幸缕?
1.手動打開瀏覽器cookie的存放位置,點擊清除cookie晰韵,那么你的登陸狀態(tài)就取消了
2.一般社交发乔,購物網(wǎng)站還有退出按鈕。它的原理也是去除cookie雪猪。