一 創建Maven項目
1 項目
2 依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.atguigu</groupId>
<artifactId>jwt</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- JWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
3 創建Member.java
/**
* @className: Member
* @description: 會員類
* @date: 2020/12/27
* @author: cakin
*/
@Data
public class Member {
/**
* 會員id
*/
private String id;
/**
* 會員暱稱
*/
private String nickname;
/**
* 會員圖像
*/
private String avatar;
}
二 創建工具類
1 創建JWT工具類
public class JwtUtils {
// 過期時間,30秒
public static final long EXPIRE = 1000 * 30;
// APP Secret
public static final String APP_SECRET = "123456";
/**
* 功能描述:生成Jwt
*
* @param id 用戶id
* @param nickname 用戶暱稱
* @param avatar 用戶圖像
* @return String jwt
* @author cakin
* @date 2020/12/27
* @description:
*/
public static String genJwt(String id, String nickname, String avatar) {
// 創建builder對象
JwtBuilder builder = Jwts.builder();
// 第一部分:JWT 頭 hdeader
builder.setHeaderParam("alg", "HS256"); // 簽名算法
builder.setHeaderParam("typ", "JWT"); // 令牌類型
// 第二部分: 有效載荷 Playload
// 默認字段
builder.setId("1"); // jwt的唯一身份標識,主要用來作爲一次性token,從而回避重放攻擊。
builder.setSubject("guli-user"); // 令牌的主題
builder.setIssuedAt(new Date());
builder.setExpiration(new Date(System.currentTimeMillis() + EXPIRE)); // 過期時間
// 私有自定義字段
builder.claim("id", id);
builder.claim("nickname", nickname);
builder.claim("avatar", avatar);
// 第三部分:簽名哈希 VERIFY SIGNATURE
builder.signWith(SignatureAlgorithm.HS256, APP_SECRET);
// 將三部分連接起來
String token = builder.compact();
return token;
}
/**
* 功能描述:驗證Jwt
*
* @param jwtToken jwt
* @return
* @author cakin
* @date 2020/12/27
* @description:
*/
public static Claims checkJwt(String jwtToken) {
JwtParser parser = Jwts.parser();
Jws<Claims> claimsJws = parser.setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
// Jwt的頭
// JwsHeader header = claimsJws.getHeader();
// Jwt有效荷載
Claims body = claimsJws.getBody();
// 簽名
// String signature = claimsJws.getSignature();
return body;
}
}
2 測試用例
public class JwtTest {
/**
* 功能描述:生成Jwt
*
* @author cakin
* @date 2020/12/27
*/
@Test
public void testGenJwt() {
Member member = new Member();
member.setId("100");
member.setNickname("cakin");
member.setAvatar("cakin.jpg");
String token = JwtUtils.genJwt(member.getId(), member.getNickname(), member.getAvatar());
System.out.println(token);
Claims claims = JwtUtils.checkJwt(token);
String id = (String) claims.get("id");
String nickname = (String) claims.get("nickname");
String avatar = (String) claims.get("avatar");
System.out.println(id);
System.out.println(nickname);
System.out.println(avatar);
}
}
3 測試結果
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIxIiwic3ViIjoiZ3VsaS11c2VyIiwiaWF0IjoxNjA5MDY1NzU4LCJleHAiOjE2MDkwNjU3ODgsImlkIjoiMTAwIiwibmlja25hbWUiOiJIZWxlbiIsImF2YXRhciI6ImhlbGVuLmpwZyJ9.qmZdJsrpWqIFG2ZuKvsRrh1wiXK0Rn7gX7fLVpX1zgk
100
cakin
cakin.jpg