最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解JWT token心得與使用實(shí)例

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

本文你能學(xué)到什么?

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

JWT token的組成

頭部(Header),格式如下:

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

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

eyJhbGciOiJIUzI1NiJ9

有效載荷(Playload):

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

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

eyJ1c2VyaWQiOjB9

簽名(Signature):

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

token在服務(wù)與客戶端的交互流程

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

關(guān)于Token的思考

服務(wù)如何判斷這個(gè)token是否合法?

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

token中能放敏感信息嗎?
不能,因?yàn)橛行лd荷是經(jīng)過(guò)Base64編碼生成的,并不是加密。所以不能存放敏感信息。

Token的優(yōu)點(diǎn)

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

Java實(shí)例:JWT token使用

部分代碼來(lái)自互聯(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,同時(shí)也能驗(yàn)證Token,當(dāng)驗(yàn)證失敗返回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,在服務(wù)器端給客戶返回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;
  }

在攔截器中對(duì)請(qǐng)求中的Token驗(yàn)證(部分代碼,表示下意思):

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • css+js制作不定高度展開收起動(dòng)畫詳解

    css+js制作不定高度展開收起動(dòng)畫詳解

    這篇文章主要介紹了css+js制作不定高度展開收起動(dòng)畫詳解的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • JavaScript promise的使用和原理分析

    JavaScript promise的使用和原理分析

    Promise 是一個(gè) ECMAScript 6 提供的類,目的是更加優(yōu)雅地書寫復(fù)雜的異步任務(wù)。由于 Promise 是 ES6 新增加的,所以一些舊的瀏覽器并不支持,蘋果的 Safari 10 和 Windows 的 Edge 14 版本以上瀏覽器才開始支持 ES6 特性
    2023-04-04
  • js運(yùn)動(dòng)動(dòng)畫的八個(gè)知識(shí)點(diǎn)

    js運(yùn)動(dòng)動(dòng)畫的八個(gè)知識(shí)點(diǎn)

    本文給大家分享的是個(gè)人在學(xué)習(xí)js運(yùn)動(dòng)動(dòng)畫的過(guò)程中總結(jié)的我們需要注意的8個(gè)知識(shí)點(diǎn),分別是速度動(dòng)畫、透明度漸變、緩沖運(yùn)動(dòng)、多物體運(yùn)動(dòng)、獲取樣式、任意屬性值、鏈?zhǔn)竭\(yùn)動(dòng)和同時(shí)運(yùn)動(dòng),非常的詳細(xì),推薦給小伙伴們。
    2015-03-03
  • JavaScript 實(shí)現(xiàn)模態(tài)對(duì)話框 源代碼大全

    JavaScript 實(shí)現(xiàn)模態(tài)對(duì)話框 源代碼大全

    對(duì)話框在Windows應(yīng)用程序中使用非常普遍,許多應(yīng)用程序的設(shè)定,與用戶交互需要通過(guò)對(duì)話框來(lái)進(jìn)行,因此對(duì)話框是Windows應(yīng)用程序中最重要的界面元素之一,是與用戶交互的重要手段。
    2009-05-05
  • TypeScript路徑別名的配置指南

    TypeScript路徑別名的配置指南

    TypeScript 提供了路徑別名的功能,方便開發(fā)者在大型項(xiàng)目中更高效地引用模塊,減少相對(duì)路徑的冗長(zhǎng)與復(fù)雜,本文將詳細(xì)介紹如何配置路徑別名,如何結(jié)合 Vite 和 Node 環(huán)境進(jìn)行別名設(shè)置,幫助開發(fā)者在項(xiàng)目開發(fā)中更為便捷地組織代碼,需要的朋友可以參考下
    2025-03-03
  • 使用JavaScript實(shí)現(xiàn)改造layer彈層移動(dòng)版組件

    使用JavaScript實(shí)現(xiàn)改造layer彈層移動(dòng)版組件

    這篇文章主要為大家詳細(xì)介紹了使用JavaScript實(shí)現(xiàn)改造layer彈層移動(dòng)版組件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • javascript實(shí)現(xiàn)動(dòng)態(tài)表頭及表列的展現(xiàn)方法

    javascript實(shí)現(xiàn)動(dòng)態(tài)表頭及表列的展現(xiàn)方法

    這篇文章主要介紹了javascript實(shí)現(xiàn)動(dòng)態(tài)表頭及表列的展現(xiàn)方法,涉及javascript動(dòng)態(tài)操作table元素的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • JS中實(shí)現(xiàn)數(shù)組開頭添加元素

    JS中實(shí)現(xiàn)數(shù)組開頭添加元素

    這篇文章主要介紹了JS中實(shí)現(xiàn)數(shù)組開頭添加元素方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Typescript3.9 常用新特性一覽(推薦)

    Typescript3.9 常用新特性一覽(推薦)

    這篇文章主要介紹了Typescript3.9 常用新特性一覽,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • js實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器

    js實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器

    這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單音樂(lè)播放器,可拖動(dòng)進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06

最新評(píng)論

怀安县| 富源县| 富平县| 山丹县| 汶川县| 安丘市| 沐川县| 四会市| 九龙城区| 凤台县| 潢川县| 黑水县| 钟祥市| 庆安县| 新乐市| 石阡县| 上高县| 保德县| 湘潭县| 扬州市| 布尔津县| 丽水市| 藁城市| 祁阳县| 阿拉善右旗| 南溪县| 榆社县| 安化县| 乐昌市| 澄城县| 嘉荫县| 安龙县| 水城县| 青河县| 五常市| 宁津县| 高唐县| 鸡东县| 武强县| 乌恰县| 上饶市|