java使用JWT的方法
一、簡介
JWT是token的一種,一個JWT字符串包含三個部分
1.Header
頭部信息,一般不需要聲明,默認為 HS256 簽名算法和 JWT 令牌類型
{
"alg": "HS256", // 指定簽名算法
"typ": "JWT" // 指定token令牌類型
}2.Payload
包含一些默認字段,還可以自定義一些私有字段,但是不要放敏感信息
iss: 發(fā)行人
exp: 到期時間
sub: 主題
aud: 用戶
nbf: 在此之前不可用
iat: 發(fā)布時間
jti: JWT ID用于標識該JWT
3.Signature
數(shù)據(jù)簽名,對上面兩部分進行數(shù)據(jù)簽名,Header部分和Payload部分先進行base64Url編碼,然后用英文句號拼接并加上一個自定義的secret字符串鹽值進行HS256對稱加密【也可以用其它算法或非對稱加密】
iss: 發(fā)行人 exp: 到期時間 sub: 主題 aud: 用戶 nbf: 在此之前不可用 iat: 發(fā)布時間 jti: JWT ID用于標識該JWT
4.組合
最后將 Header、Payload、Signature三部分用英文句號拼接就生成了完整的JWT
Header.Payload.Signature
二、封裝類
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過期時間
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR, 24); // 24小時
JWTCreator.Builder builder = JWT.create();
// 構(gòu)建payload
payload.forEach(builder::withClaim);
// 指定過期時間和簽名算法,并返回token
String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET));
return token;
}
/**
* 解析token
* @param token token字符串
* @return 解析后的token類
*/
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); // 取出默認屬性【過期時間】
} catch (JWTDecodeException e) {
System.out.println("令牌錯誤");
} catch (TokenExpiredException e) {
System.out.println("令牌過期");
}
// -------------------------------------------------------------------
}
}

ps:最后附一篇寫的很詳細的JWT文章http://m.fzitv.net/article/250529.htm
到此這篇關(guān)于java使用JWT的文章就介紹到這了,更多相關(guān)java使用JWT內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis-plus批處理IService的實現(xiàn)示例
這篇文章主要介紹了mybatis-plus批處理IService的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08
解讀HttpServletRequestWrapper處理request數(shù)據(jù)流多次讀取問題
在Java Web開發(fā)中,獲取HTTP請求參數(shù)是常見需求,本文詳細討論了通過POST方式獲取參數(shù)的兩種主要方法:使用request.getParameter()適用于application/x-www-form-urlencoded和multipart/form-data內(nèi)容類型;而對于application/json類型的數(shù)據(jù)2024-10-10
Java靜態(tài)方法不能調(diào)用非靜態(tài)成員的原因分析
在Java中,靜態(tài)方法是屬于類的方法,而不是屬于對象的方法,它可以通過類名直接調(diào)用,無需創(chuàng)建對象實例,非靜態(tài)成員指的是類的實例變量和實例方法,它們需要通過對象實例才能訪問和調(diào)用,本文小編將和大家一起探討Java靜態(tài)方法為什么不能調(diào)用非靜態(tài)成員2023-10-10
Spring?Data?JPA實現(xiàn)持久化存儲數(shù)據(jù)到數(shù)據(jù)庫的示例代碼
Spring Data JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套 JPA 應(yīng)?框架,可使開發(fā)者?極簡的代碼即可實現(xiàn)對數(shù)據(jù)庫的訪問和操作。本文我們來了解如何用Spring?Data?JPA框架實現(xiàn)數(shù)據(jù)持久化存儲到數(shù)據(jù)庫,感興趣的可以了解一下2022-04-04

