token的作用及實現(xiàn)原理
1:首先,先了解一下request和session的區(qū)別
request 指在一次請求的全過程中有效,即從http請求到服務器處理結(jié)束,返回響應的整個過程,存放在HttpServletRequest對象中。在這個過程中可以使用forward方式跳轉(zhuǎn)多個jsp。在這些頁面里你都可以使用這個變量。request是用戶請求訪問的當前組件,以及和當前web組件共享同一用戶請求的web組件。如:被請求的jsp頁面和該頁面用<include>指令包含的頁面以及<forward>標記包含的其它jsp頁面;
Session是用戶全局變量,在整個會話期間都有效。只要頁面不關閉就一直有效(或者直到用戶一直未活動導致會話過期,默認session過期時間為30分鐘,或調(diào)用HttpSession的invalidate()方法)。存放在HttpSession對象中 ,同一個http會話中的web組件共享它。
2:token主要有兩個作用:①:防止表單重復提交(防止表單重復提交一般還是使用前后端都限制的方式,比如:在前端點擊提交之后,將按鈕置為灰色,不可再次點擊,然后客戶端和服務端的token各自獨立存儲,客戶端存儲在Cookie或者Form的隱藏域(放在Form隱藏域中的時候,需要每個表單)中,服務端存儲在Session(單機系統(tǒng)中可以使用)或者其他緩存系統(tǒng)(分布式系統(tǒng)可以使用)中。)
3:防止表單重復提交,主要的理念是,客戶端初始化的時候,一般就是剛剛進入頁面的時候就調(diào)用后端代碼,后端代碼生成一個token,返回給客戶端,客戶端儲存token(可以在前臺使用Form表單中使用隱藏域來存儲這個Token,也可以使用cookie),然后就將request(請求)中的token與(session)中的token進行比較。
4:使用基于 Token 的身份驗證方法,在服務端不需要存儲用戶的登錄記錄。大概的流程是這樣的:
客戶端使用用戶名跟密碼請求登錄
服務端收到請求,去驗證用戶名與密碼
驗證成功后,服務端會簽發(fā)一個 Token,再把這個 Token 發(fā)送給客戶端
客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里
客戶端每次向服務端請求資源的時候需要帶著服務端簽發(fā)的 Token
服務端收到請求,然后去驗證客戶端請求里面帶著的 Token,如果驗證成功,就向客戶端返回請求的數(shù)據(jù)。
Token的意義及用法
一.Token的來源:
? ? ? ?當客戶端多次向服務端請求數(shù)據(jù)時,服務端就需要多次從數(shù)據(jù)庫中查詢用戶名和密碼并進行對比,判斷用戶名和密碼是否正確,并作出相應提示。但這樣無疑會增加服務器端的運行壓力,是否可以有一種方式只需要驗證用戶就是之前的用戶而不需要每次在客戶端請求數(shù)據(jù)時都需要查詢數(shù)據(jù)庫判斷用戶名和密碼是否正確。在這種請求下,引入了token來解決服務器端多次訪問數(shù)據(jù)庫問題。
1.什么是Token:?
? ? ? ?Token是服務端端生成的一串字符串,作為客戶端進行請求時辨別客戶身份的的一個令牌。當用戶第一次登錄后,服務器生成一個Token便將此Token返回給客戶端,以后客戶端只需帶上這個Token前來請求數(shù)據(jù)即可,無需再次帶上用戶名和密碼。
2.使用Token的目的:?
Token的目的是為了驗證用戶登錄情況以及減輕服務器的壓力,減少頻繁的查詢數(shù)據(jù)庫,使服務器更加健壯
二. Token的運用流程:
當用戶首次登錄成功之后, 服務器端就會生成一個 token 值,這個值,會在服務器保存token值(保存在數(shù)據(jù)庫中),再將這個token值返回給客戶端;
客戶端拿到 token 值之后,進行保存 (保存位置由服務器端設置);
以后客戶端再次發(fā)送網(wǎng)絡請求(一般不是登錄請求)的時候,就會將這個 token 值附帶到參數(shù)中發(fā)送給服務器.;
服務器接收到客戶端的請求之后,會取出token值與保存在本地(數(shù)據(jù)庫)中的token值進行比較;
如果兩個 token 值相同, 說明用戶登錄成功過!當前用戶處于登錄狀態(tài);
如果沒有這個 token 值, 沒有登錄成功;
如果 token 值不同: 說明原來的登錄信息已經(jīng)失效,讓用戶重新登錄;
Django Rest framework中JWT的使用稍有差異,這里不做詳細說明。