日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JWT (Json Web Token)教程

發布時間:2024/2/28 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JWT (Json Web Token)教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JWT(Json Web Token)是實現token技術的一種解決方案,JWT由三部分組成:?header(頭)、payload(載體)、signature(簽名)。

JWT第一部分是header,header主要包含兩個部分,alg指加密類型,可選值為HS256、RSA等等,typ=JWT為固定值,表示token的類型。。

{"typ": "JWT","alg": "HS256" }

載體

JWT第二部分是payload,payload是token的詳細內容,一般包括iss?(發行者),?exp?(過期時間),?sub(用戶信息),?aud?(接收者),以及其他信息,詳細介紹請參考官網,也可以包含自定義字段。

{"iat": 1493090001,"name": "張三" } iss:Issuer,發行者 sub:Subject,主題 aud:Audience,觀眾 exp:Expiration time,過期時間 nbf:Not before iat:Issued at,發行時間 jti:JWT ID

簽名

JWT第二部分是signature,這部分的內容是這樣計算得來的:

Base64(header).Base64(payload)得到一個Base64編碼的字符串(下文成EncodeString)
HS256(EncodeString,"秘鑰");計算得到的即使簽名。
計算得到上面三部分內容后,用.連接起來就是一個完整的 JWT TOKEN,秘鑰是保存在服務器上的一個私有密鑰。

將頭部、聲明、簽名用.號連在一起就得到了我們要的JWT。

eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MTUyOTgxNDEsImtleSI6InZhdWxlIn0.orewTmil7YmIXKILHwFnw3Bq1Ox4maXEzp0NC5LRaFQ

和Session方式存儲id的差異

Session方式存儲用戶id的最大弊病在于要占用大量服務器內存,對于較大型應用而言可能還要保存許多的狀態。一般而言,大型應用還需要借助一些KV數據庫和一系列緩存機制來實現Session的存儲。

而JWT方式將用戶狀態分散到了客戶端中,可以明顯減輕服務端的內存壓力。除了用戶id之外,還可以存儲其他的和用戶相關的信息,例如用戶角色,用戶性別等。

java 使用 jwt

引入jar

<!--JWT--> <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version> </dependency>

demo

package user;import io.jsonwebtoken.*; import org.joda.time.DateTime; import org.junit.Test;import java.util.Date;public class JWT {private static final String PRIVATE_KEY = "123456789";@Testpublic void jwtTest() throws InterruptedException {// 設置3秒后過期String jwt = this.buildJwt(DateTime.now().plusSeconds(3).toDate());System.out.println(jwt);// 驗證token是否可用boolean isOk = this.isJwtValid(jwt);System.out.println(isOk);}public String buildJwt(Date exp) {String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256, PRIVATE_KEY)//SECRET_KEY是加密算法對應的密鑰,這里使用額是HS256加密算法.setExpiration(exp)//expTime是過期時間.claim("key", "vaule")//該方法是在JWT中加入值為vaule的key字段.compact();return jwt;}public boolean isJwtValid(String jwt) {try {//解析JWT字符串中的數據,并進行最基礎的驗證Claims claims = Jwts.parser().setSigningKey(PRIVATE_KEY)//SECRET_KEY是加密算法對應的密鑰,jjwt可以自動判斷機密算法.parseClaimsJws(jwt)//jwt是JWT字符串.getBody();String vaule = claims.get("key", String.class);//獲取自定義字段key//判斷自定義字段是否正確if ("vaule".equals(vaule)) {return true;} else {return false;}}//在解析JWT字符串時,如果密鑰不正確,將會解析失敗,拋出SignatureException異常,說明該JWT字符串是偽造的//在解析JWT字符串時,如果‘過期時間字段’已經早于當前時間,將會拋出ExpiredJwtException異常,說明本次請求已經失效catch (SignatureException | ExpiredJwtException e) {return false;}} }

總結

以上是生活随笔為你收集整理的JWT (Json Web Token)教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。