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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JWT (Json Web Token)教程

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

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

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

載體

JWT第二部分是payload,payload是token的詳細(xì)內(nèi)容,一般包括iss?(發(fā)行者),?exp?(過(guò)期時(shí)間),?sub(用戶信息),?aud?(接收者),以及其他信息,詳細(xì)介紹請(qǐng)參考官網(wǎng),也可以包含自定義字段。

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

簽名

JWT第二部分是signature,這部分的內(nèi)容是這樣計(jì)算得來(lái)的:

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

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

eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE1MTUyOTgxNDEsImtleSI6InZhdWxlIn0.orewTmil7YmIXKILHwFnw3Bq1Ox4maXEzp0NC5LRaFQ

和Session方式存儲(chǔ)id的差異

Session方式存儲(chǔ)用戶id的最大弊病在于要占用大量服務(wù)器內(nèi)存,對(duì)于較大型應(yīng)用而言可能還要保存許多的狀態(tài)。一般而言,大型應(yīng)用還需要借助一些KV數(shù)據(jù)庫(kù)和一系列緩存機(jī)制來(lái)實(shí)現(xiàn)Session的存儲(chǔ)。

而JWT方式將用戶狀態(tài)分散到了客戶端中,可以明顯減輕服務(wù)端的內(nèi)存壓力。除了用戶id之外,還可以存儲(chǔ)其他的和用戶相關(guān)的信息,例如用戶角色,用戶性別等。

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 {// 設(shè)置3秒后過(guò)期String jwt = this.buildJwt(DateTime.now().plusSeconds(3).toDate());System.out.println(jwt);// 驗(yàn)證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是加密算法對(duì)應(yīng)的密鑰,這里使用額是HS256加密算法.setExpiration(exp)//expTime是過(guò)期時(shí)間.claim("key", "vaule")//該方法是在JWT中加入值為vaule的key字段.compact();return jwt;}public boolean isJwtValid(String jwt) {try {//解析JWT字符串中的數(shù)據(jù),并進(jìn)行最基礎(chǔ)的驗(yàn)證Claims claims = Jwts.parser().setSigningKey(PRIVATE_KEY)//SECRET_KEY是加密算法對(duì)應(yīng)的密鑰,jjwt可以自動(dòng)判斷機(jī)密算法.parseClaimsJws(jwt)//jwt是JWT字符串.getBody();String vaule = claims.get("key", String.class);//獲取自定義字段key//判斷自定義字段是否正確if ("vaule".equals(vaule)) {return true;} else {return false;}}//在解析JWT字符串時(shí),如果密鑰不正確,將會(huì)解析失敗,拋出SignatureException異常,說(shuō)明該JWT字符串是偽造的//在解析JWT字符串時(shí),如果‘過(guò)期時(shí)間字段’已經(jīng)早于當(dāng)前時(shí)間,將會(huì)拋出ExpiredJwtException異常,說(shuō)明本次請(qǐng)求已經(jīng)失效catch (SignatureException | ExpiredJwtException e) {return false;}} }

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。