欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解JWT token心得與使用實例

 更新時間:2019年08月02日 15:55:55   作者:bug_lover_liao  
這篇文章主要介紹了詳解JWT token心得與使用實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

本文你能學到什么?

token的組成
token串的生成流程。
token在客戶端與服務器端的交互流程
Token的優(yōu)點和思考
參考代碼:核心代碼使用參考,不是全部代碼

JWT token的組成

頭部(Header),格式如下:

{ 
“typ”: “JWT”, 
“alg”: “HS256” 
} 

由上可知,該token使用HS256加密算法,將頭部使用Base64編碼可得到如下個格式的字符串:

eyJhbGciOiJIUzI1NiJ9

有效載荷(Playload):

{ 
“iss”: “Online JWT Builder”, 
“iat”: 1416797419, 
“exp”: 1448333419, 
……. 
“userid”:10001 
} 

有效載荷中存放了token的簽發(fā)者(iss)、簽發(fā)時間(iat)、過期時間(exp)等以及一些我們需要寫進token中的信息。有效載荷也使用Base64編碼得到如下格式的字符串:

eyJ1c2VyaWQiOjB9

簽名(Signature):

將Header和Playload拼接生成一個字符串str=“eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOjB9”,使用HS256算法和我們提供的密鑰(secret,服務器自己提供的一個字符串)對str進行加密生成最終的JWT,即我們需要的令牌(token),形如:str.”簽名字符串”。

token在服務與客戶端的交互流程

1:客戶端通過用戶名和密碼登錄
2:服務器驗證用戶名和密碼,若通過,生成token返回給客戶端。
3:客戶端收到token后以后每次請求的時候都帶上這個token,相當于一個令牌,表示我有權限訪問了
4:服務器接收(通常在攔截器中實現(xiàn))到該token,然后驗證該token的合法性(為什么能驗證下面說)。若該token合法,則通過請求,若token不合法或者過期,返回請求失敗。

關于Token的思考

服務如何判斷這個token是否合法?

由上面token的生成可知,token中的簽名是由Header和有效載荷通過Base64編碼生成再通過加密算法HS256和密鑰最終生成簽名,這個簽名位于JWT的尾部,在服務器端同樣對返回過來的JWT的前部分再進行一次簽名生成,然后比較這次生成的簽名與請求的JWT中的簽名是否一致,若一致說明token合法。由于生成簽名的密鑰是服務器才知道的,所以別人難以偽造。

token中能放敏感信息嗎?
不能,因為有效載荷是經過Base64編碼生成的,并不是加密。所以不能存放敏感信息。

Token的優(yōu)點

(1)相比于session,它無需保存在服務器,不占用服務器內存開銷。
(2)無狀態(tài)、可拓展性強:比如有3臺機器(A、B、C)組成服務器集群,若session存在機器A上,session只能保存在其中一臺服務器,此時你便不能訪問機器B、C,因為B、C上沒有存放該Session,而使用token就能夠驗證用戶請求合法性,并且我再加幾臺機器也沒事,所以可拓展性好就是這個意思。
(3)由(2)知,這樣做可就支持了跨域訪問。

Java實例:JWT token使用

部分代碼來自互聯(lián)網(wǎng),找不到原作者了。。

編寫JWT(Java Web Token)操作類:JavaWebToken

public class JavaWebToken {

  private static Logger log = LoggerFactory.getLogger(JavaWebToken.class);

  //該方法使用HS256算法和Secret:bankgl生成signKey
  private static Key getKeyInstance() {
    //We will sign our JavaWebToken with our ApiKey secret
    SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
    byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary("bankgl");
    Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
    return signingKey;
  }

  //使用HS256簽名算法和生成的signingKey最終的Token,claims中是有效載荷
  public static String createJavaWebToken(Map<String, Object> claims) {
    return Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS256, getKeyInstance()).compact();
  }

  //解析Token,同時也能驗證Token,當驗證失敗返回null
  public static Map<String, Object> parserJavaWebToken(String jwt) {
    try {
      Map<String, Object> jwtClaims =
          Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwt).getBody();
      return jwtClaims;
    } catch (Exception e) {
      log.error("json web token verify failed");
      return null;
    }
  }
}

編寫登錄Conreoller,在服務器端給客戶返回token.

public LoginStatusMessage checkUserAndPassword(
  @RequestParam(value="username",required=true) String username,
  @RequestParam(value="password",required=true) String password,User user,HttpServletRequest request) throws Exception{
    User u = new User();
    //登錄成功
    if((u = userService.checkUsernameAndPassword(user)) != null){
      Map<String,Object> m = new HashMap<String,Object>();
      m.put("userid", user.getUserid());
      String token = JavaWebToken.createJavaWebToken(m);
      System.out.println(token);
      LoginStatusMessage lsm = new LoginStatusMessage();
      lsm.setUser(u);
      lsm.setToken(token);
      return lsm;
    };
    //登錄失敗,返回Null
    return null;
  }

在攔截器中對請求中的Token驗證(部分代碼,表示下意思):

String token = request.getParameter("token");
      if(JavaWebToken.parserJavaWebToken(token) != null){
        //表示token合法
        return true;
      }else{
        //token不合法或者過期
        return false;
      }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • for?of?和?for?in?的區(qū)別介紹

    for?of?和?for?in?的區(qū)別介紹

    這篇文章主要介紹了for?of?和?for?in?的區(qū)別,for?of?和?for?in都是用來遍歷的屬性,本文重點介紹下for?of?和?for?in?的區(qū)別,需要的朋友可以參考下
    2022-12-12
  • JS獲取url參數(shù)、主域名的方法實例分析

    JS獲取url參數(shù)、主域名的方法實例分析

    這篇文章主要介紹了JS獲取url參數(shù)、主域名的方法,結合實例形式分析了javascript針對主機域名、端口、路徑名、URL參數(shù)等的相關操作技巧,需要的朋友可以參考下
    2016-08-08
  • 關于微信中a鏈接無法跳轉問題

    關于微信中a鏈接無法跳轉問題

    微信頁面開發(fā)時,各個主頁之間的跳轉,完全是通過a鏈接進行的,但是來回跳轉幾次,再次從其他主頁面跳回首頁的時候,微信頭部出現(xiàn)了跳轉加載進度條,但是就是不跳轉,也沒有任何反應,怎么回事呢?下面小編給大家解答下
    2016-08-08
  • 通過大白話理解微信小程序的授權登錄

    通過大白話理解微信小程序的授權登錄

    很多人會把微信小程序的登錄和授權搞混淆,下面這篇文章主要給大家介紹了如何通過大白話理解微信小程序授權登錄的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • JavaScript生成隨機字符串的方法

    JavaScript生成隨機字符串的方法

    這篇文章主要介紹了JavaScript生成隨機字符串的方法,涉及javascript中random的使用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • 在layer彈層layer.prompt中,修改placeholder的實現(xiàn)方法

    在layer彈層layer.prompt中,修改placeholder的實現(xiàn)方法

    今天小編大家分享一篇在layer彈層layer.prompt中,修改placeholder的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 解決JS內存泄露之js對象和dom對象互相引用問題

    解決JS內存泄露之js對象和dom對象互相引用問題

    這篇文章主要介紹了解決JS內存泄露之js對象和dom對象互相引用問題,需要的朋友可以參考下
    2017-06-06
  • 利用js canvas實現(xiàn)五子棋游戲

    利用js canvas實現(xiàn)五子棋游戲

    這篇文章主要為大家詳細介紹了利用js canvas實現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • jsp js鼠標移動到指定區(qū)域顯示選項卡離開時隱藏示例

    jsp js鼠標移動到指定區(qū)域顯示選項卡離開時隱藏示例

    jsp js 鼠標移動到指定區(qū)域顯示選項卡示例,離開時隱藏,具體實現(xiàn)代碼如下,感興趣的朋友可以了解下哈,希望對你有所幫助
    2013-06-06
  • 小程序如何支持使用 async/await詳解

    小程序如何支持使用 async/await詳解

    這篇文章主要介紹了小程序如何支持使用 async/await詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09

最新評論