隨着互聯網的不斷髮展,技術的迭代也很是之快。咱們的用戶認證也從剛開始的用戶名密碼轉變到基於cookie的session認證,然而到了今天,這種認證已經不能知足與咱們的業務需求了(分佈式,微服務)。咱們採用了另一種認證方式:基於token的認證。java
1、與cookie相比較的優點:python
一、支持跨域訪問,將token置於請求頭中,而cookie是不支持跨域訪問的;小程序
二、無狀態化,服務端無需存儲token,只須要驗證token信息是否正確便可,而session須要在服務端存儲,通常是經過cookie中的sessionID在服務端查找對應的session;後端
三、無需綁定到一個特殊的身份驗證方案(傳統的用戶名密碼登錄),只須要生成的token是符合咱們預期設定的便可;微信小程序
四、更適用於移動端(Android,iOS,小程序等等),像這種原平生臺不支持cookie,好比說微信小程序,每一次請求都是一次會話,固然咱們能夠每次去手動爲他添加cookie,詳情請查看博主另外一篇博客;跨域
五、避免CSRF跨站僞造攻擊,仍是由於不依賴cookie;安全
六、很是適用於RESTful API,這樣能夠輕易與各類後端(java,.net,python......)相結合,去耦合微信
還有一些優點這裏就不一一列舉了。cookie
2、基於JWT的token認證明現session
JWT:JSON Web Token,其實token就是一段字符串,由三部分組成:Header,Payload,Signature。詳細狀況請自行百度,如今,上代碼。
一、引入依賴,這裏選用java-jwt,選擇其餘的依賴也能夠
二、實現簽名方法
設置15分鐘過時也是出於安全考慮,防止token被竊取,不過通常選擇基於token認證,傳輸方式咱們都應該選擇https,這樣別人沒法抓取到咱們的請求信息。這個私鑰是很是重要的,加密解密都須要用到它,要設置的足夠複雜而且不能被盜取,我這裏選用的是一串uuid,加密方式是HMAC256。
三、認證
我這裏演示的仍是以傳統的用戶名密碼驗證,驗證經過發放token。
四、配置攔截器
實現HandleInterceptor,重寫preHandle方法,該方法是在每一個請求以前觸發執行,從request的頭裏面取出token,這裏咱們統一了存放token的鍵爲accessToken,驗證經過,放行,驗證不經過,返回認證失敗信息。
五、設置攔截器
這裏使用的是Spring的xml配置攔截器,放過認證接口。
六、token解碼方法
七、測試
訪問攜帶token,請求成功。
未攜帶token或者token錯誤,過時,返回認證失敗信息。
八、獲取token裏攜帶的信息
咱們能夠將一些經常使用的信息放入token中,好比用戶登錄信息,能夠方便咱們的使用
至此,一個簡單的基於token認證就實現了,下次我將shiro與JWT整合到一塊兒。