登錄校驗:判斷用户是否登錄,從而決定是否讓其執行相關操作。(已登錄則可執行,未登錄則不可,必須登錄後才能執行)
具體操作步驟:
1、記錄用户已經成功登錄的標記(會話技術)會話:指的就是瀏覽器與服務器之間的一次連接。在一次會話當中,是可以包含多次請求和響應的(瀏覽器不能關閉、服務器不能斷開)會話跟蹤:服務器識別多次請求是否來自於同一瀏覽器,以實現在同一次會話的多次請求間共享數據。此技術一般有三種:
①Cookie(客户端會話跟蹤技術):數據存儲在客户端瀏覽器中
HTTP 協議官方提供了一個cookie的響應頭和請求頭:- 響應頭 Set-Cookie :設置Cookie數據的- 請求頭 Cookie:攜帶Cookie數據的
優點:瀏覽器自動進行,無需手動操作
缺點:移動端APP無法使用Cookie; 不安全,用户可以自己禁用Cookie;Cookie不能跨域(在協議、IP、端口這三個維度有任何維度不同,就是跨域)
②Session(服務端會話跟蹤技術,底層基於Cookie):數據存儲在服務端瀏覽器在第一次請求服務器的時候,服務器會自動的創建一個會話對象Session(每一個會話對象Session ,它都有一個ID)。服務器將Session的id響應給瀏覽器,瀏覽器會自動識別這個響應頭,然後自動將Cookie存儲在瀏覽器本地。之後瀏覽器的每一次請求都會把這個cookie帶給服務端,服務端識別cookie的session的id,從眾多的 Session 當中來找到當前請求對應的會話對象Session。
優點:存儲在服務端,安全
缺點:服務器集羣環境(通過負載均衡部署到多個服務器)下無法直接使用Session移動端APP無法使用Cookie; 不安全,用户可以自己禁用Cookie;Cookie不能跨域
③令牌技術(Token)(用户身份的標識,本質是一個字符串)瀏覽器如果請求登錄接口且登錄成功,服務器則生成一個令牌(共享數據存在令牌中)並響應給前端,前端存儲令牌(存在cookie或其他存儲空間)。之後每一次請求,都將令牌帶到服務端,如果令牌有效,説明已經登錄(放行),如果無效,説明沒有登錄(拋異常)。
優點: 支持PC端、移動端 解決集羣環境下的認證問題 減輕服務器的存儲壓力(無需在服務器端存儲)
缺點:需要自己實現(包括令牌的生成、令牌的傳遞、令牌的校驗)
JWT令牌(Json Web Token)
使用JWT令牌實現登錄認證:
JWT組成:
①頭(Header):記錄令牌類型、算法
②有效載荷(Payload):攜帶自定義信息、默認信息(如用户名,用户id,令牌有效時間等)
③數字簽名(signature):將頭,載荷加入指定密鑰,通過指定簽名算法計算而來。可以防止Token被篡改、確保安全性JWT通過base64編碼將Json格式數據轉變為字符串
JWT令牌生成與解析(需要引入JWT的依賴):
如何實現登錄成功之後生成JWT令牌,並且把令牌返回給前端:
創建util包,引入JWT工具類。完善業務層實現類中的登錄方法:在登錄成功後創建jwt令牌並返回
2、瀏覽器發起請求,服務端進行統一攔截,攔截後進行登錄校驗(同一攔截技術:過濾器Filter、攔截器Interceptor)
Filter:過濾器,是 JavaWeb三大組件(Servlet、Filter、Listener)之一。過濾器可以把對資源的請求攔截下來。過濾器一般完成一些通用的操作,比如:登錄校驗、統一編碼處理、敏感字符處理等使用過濾器:
第1步,定義過濾器 :1.定義一個類,實現 Filter 接口,並重寫其所有方法。
第2步,配置過濾器:Filter類上加 @WebFilter 註解,配置攔截資源的路徑(如@WebFilter(urlPatterns = "/*")。引導類上加 @ServletComponentScan
Filter接口的方法:
init方法:過濾器的初始化方法。在web服務器啓動的時候會自動的創建Filter過濾器對象,在創建過濾器對象的時候會自動調用init初始化方法,這個方法只會被調用一次。
doFilter方法:這個方法是在每一次攔截到請求之後都會被調用,所以這個方法是會被調用多次的,每攔截到一次請求就會調用一次doFilter()方法。在這裏要放行,代碼如下:chain.doFilter(request, response),否則將無法訪問後面的資源。
destroy方法: 是銷燬的方法。當我們關閉服務器的時候,它會自動的調用銷燬方法destroy,而這個銷燬方法也只會被調用一次。
Filter過濾器校驗令牌:
1. 獲取請求url
2. 判斷請求url中是否包含login,如果包含,説明是登錄操作,放行
3. 獲取請求頭中的令牌(token)
4. 判斷令牌是否存在,如果不存在,響應 401
5. 解析token,如果解析失敗,響應 401
6. 放行 無狀態協議:每一次請求都是獨立的,下一次請求並不會攜帶上一次請求的數據,服務器不知道這個用户登錄了沒有。(如http協議)