java使用JWT的方法
一、簡(jiǎn)介
JWT是token的一種,一個(gè)JWT字符串包含三個(gè)部分
1.Header
頭部信息,一般不需要聲明,默認(rèn)為 HS256 簽名算法和 JWT 令牌類(lèi)型
{ "alg": "HS256", // 指定簽名算法 "typ": "JWT" // 指定token令牌類(lèi)型 }
2.Payload
包含一些默認(rèn)字段,還可以自定義一些私有字段,但是不要放敏感信息
iss: 發(fā)行人
exp: 到期時(shí)間
sub: 主題
aud: 用戶
nbf: 在此之前不可用
iat: 發(fā)布時(shí)間
jti: JWT ID用于標(biāo)識(shí)該JWT
3.Signature
數(shù)據(jù)簽名,對(duì)上面兩部分進(jìn)行數(shù)據(jù)簽名,Header部分和Payload部分先進(jìn)行base64Url編碼,然后用英文句號(hào)拼接并加上一個(gè)自定義的secret字符串鹽值進(jìn)行HS256對(duì)稱(chēng)加密【也可以用其它算法或非對(duì)稱(chēng)加密】
iss: 發(fā)行人 exp: 到期時(shí)間 sub: 主題 aud: 用戶 nbf: 在此之前不可用 iat: 發(fā)布時(shí)間 jti: JWT ID用于標(biāo)識(shí)該JWT
4.組合
最后將 Header、Payload、Signature三部分用英文句號(hào)拼接就生成了完整的JWT
Header.Payload.Signature
二、封裝類(lèi)
1.引入依賴
<!-- jwt --> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.10.3</version> </dependency>
2.封裝方法
package com.cxstar.utils; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTCreator; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import com.auth0.jwt.interfaces.JWTVerifier; import java.util.Calendar; import java.util.Map; public class JwtUtil { // 簽名密鑰 private static final String SECRET = "hello JWT *%$#$&"; /** * 生成token * @param payload token攜帶的信息 * @return token字符串 */ public static String generateToken(Map<String,String> payload){ // 指定token過(guò)期時(shí)間 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.HOUR, 24); // 24小時(shí) JWTCreator.Builder builder = JWT.create(); // 構(gòu)建payload payload.forEach(builder::withClaim); // 指定過(guò)期時(shí)間和簽名算法,并返回token String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET)); return token; } /** * 解析token * @param token token字符串 * @return 解析后的token類(lèi) */ public static DecodedJWT decodeToken(String token){ JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build(); DecodedJWT decodedJWT = jwtVerifier.verify(token); return decodedJWT; } }
三、使用方法
package com.cxstar; import com.auth0.jwt.exceptions.JWTDecodeException; import com.auth0.jwt.exceptions.TokenExpiredException; import com.auth0.jwt.interfaces.DecodedJWT; import com.cxstar.utils.JwtUtil; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.HashMap; import java.util.Map; @SpringBootTest class JwtLoginApplicationTests { @Test void tokenTest() { // 根據(jù)用戶信息生成令牌 -------------------------- Map<String, String> payload = new HashMap<>(); payload.put("userId", "233"); payload.put("userName", "ps"); String token = JwtUtil.generateToken(payload); System.out.println("token: " + token); // -------------------------------------------- // 解析令牌并獲取用戶信息 ------------------------------------------------ try { DecodedJWT decodedJWT = JwtUtil.decodeToken(token); String userId = decodedJWT.getClaim("userId").asString(); String userName = decodedJWT.getClaim("userName").asString(); String exp = decodedJWT.getExpiresAt().toString(); System.out.println("userId: " + userId); // 取出自定義屬性【用戶id】 System.out.println("userName: " + userName); // 取出自定義屬性【用戶名】 System.out.println("exp: " + exp); // 取出默認(rèn)屬性【過(guò)期時(shí)間】 } catch (JWTDecodeException e) { System.out.println("令牌錯(cuò)誤"); } catch (TokenExpiredException e) { System.out.println("令牌過(guò)期"); } // ------------------------------------------------------------------- } }
ps:最后附一篇寫(xiě)的很詳細(xì)的JWT文章http://www.dbjr.com.cn/article/250529.htm
到此這篇關(guān)于java使用JWT的文章就介紹到這了,更多相關(guān)java使用JWT內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何在Maven項(xiàng)目中運(yùn)行JUnit5測(cè)試用例實(shí)現(xiàn)
這篇文章主要介紹了如何在Maven項(xiàng)目中運(yùn)行JUnit5測(cè)試用例實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04SpringBoot中間件ORM框架實(shí)現(xiàn)案例詳解(Mybatis)
這篇文章主要介紹了SpringBoot中間件ORM框架實(shí)現(xiàn)案例詳解(Mybatis),本篇文章提煉出mybatis最經(jīng)典、最精簡(jiǎn)、最核心的代碼設(shè)計(jì),來(lái)實(shí)現(xiàn)一個(gè)mini-mybatis,從而熟悉并掌握ORM框架的涉及實(shí)現(xiàn),需要的朋友可以參考下2023-07-07SpringBoot+Response如何統(tǒng)一返回result結(jié)果集
這篇文章主要介紹了SpringBoot+Response如何統(tǒng)一返回result結(jié)果集,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05linux下idea、pycharm等輸入中文拼音時(shí)滿3個(gè)字母后無(wú)法繼續(xù)拼音輸入的問(wèn)題
這篇文章主要介紹了linux下idea、pycharm等輸入中文拼音時(shí)滿3個(gè)字母后無(wú)法繼續(xù)拼音輸入的問(wèn)題,本文通過(guò)圖文并茂的形式給大家分享解決方法,需要的朋友可以參考下2021-04-04基于SpringBoot+Redis的Session共享與單點(diǎn)登錄詳解
這篇文章主要介紹了基于SpringBoot+Redis的Session共享與單點(diǎn)登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07java數(shù)據(jù)結(jié)構(gòu)循環(huán)隊(duì)列的空滿判斷及長(zhǎng)度計(jì)算
這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)循環(huán)隊(duì)列的空滿判斷及長(zhǎng)度計(jì)算,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06springboot項(xiàng)目不加端口號(hào)也可以訪問(wèn)項(xiàng)目的方法步驟分析
這篇文章主要介紹了springboot項(xiàng)目不加端口號(hào)也可以訪問(wèn)項(xiàng)目的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04