JWT令牌
案例:mysc-parent3
1. 在公共模块添加依赖
<!-- Jwt令牌依赖 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
2. 在工具包(utils)下创建 JwtUtil 工具类
package com.ddz.utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
public class JwtUtil {
//有效期为
public static final Long JWT_TTL = 3600000L;// 60 * 60 *1000 一个小时
//Jwt令牌信息
public static final String JWT_KEY = "xzzb";
public static String createJWT(String id, String subject, Long ttlMillis) {
//指定算法
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//当前系统时间
long nowMillis = System.currentTimeMillis();
//令牌签发时间
Date now = new Date(nowMillis);
//如果令牌有效期为null,则默认设置有效期1小时
if (ttlMillis == null) {
ttlMillis = JwtUtil.JWT_TTL;
}
//令牌过期时间设置
long expMillis = nowMillis + ttlMillis;
Date expDate = new Date(expMillis);
//生成秘钥
SecretKey secretKey = generalKey();
//封装Jwt令牌信息
JwtBuilder builder = Jwts.builder()
.setId(id) //唯一的ID
.setSubject(subject) // 主题 可以是JSON数据
.setIssuer("admin") // 签发者
.setIssuedAt(now) // 签发时间
.signWith(signatureAlgorithm, secretKey) // 签名算法以及密匙
.setExpiration(expDate); // 设置过期时间
return builder.compact();
}
/**
* 生成加密 secretKey
*
* @return
*/
public static SecretKey generalKey() {
byte[] encodedKey = Base64.getEncoder().encode(JwtUtil.JWT_KEY.getBytes());
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
public static void main(String[] args) {
try {
Claims claims = parseJWT("eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI3YWI1YWJjOS1hOTMzLTQxYTctYWUzNS1mYjhkMGQ5MzExM2MiLCJzdWIiOiJ7XCJuYW1lXCI6XCJhZG1pblwiLFwibmlja25hbWVcIjpcIuW8oOS4iVwiLFwicHdkXCI6XCIxMjNcIn0iLCJpc3MiOiJhZG1pbiIsImlhdCI6MTYwMDkzOTI3NywiZXhwIjoxNjAwOTQyODc3fQ.ifhUsi-4-KLeU2b7fK21JM5JwSuvzh2U3adnR264K2E");
System.out.println(claims);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 解析令牌数据
*
* @param jwt
* @return
* @throws Exception
*/
public static Claims parseJWT(String jwt) throws Exception {
SecretKey secretKey = generalKey();
return Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getBody();
}
}
3. 创建测试类,运行main方法就能得出jwt令牌
package com.ddz.test;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class JwtTest {
public static void main(String[] args) throws Exception {
String jwt = createJwt();
System.out.println(jwt);
parseJwt(jwt);
}
/**
* @return 创建
* @throws Exception
*/
public static String createJwt() throws Exception {
Map<String, Object> userInfo = new HashMap<>();
userInfo.put("name", "张三");
userInfo.put("age", 20);
userInfo.put("address", "徐州解放路");
JwtBuilder builder = Jwts.builder();
builder.setId(UUID.randomUUID().toString()); //设置唯一编号
builder.setSubject("{'username':'admin','pwd':'123'}"); //设置主题 可以是JSON数据
builder.addClaims(userInfo);
builder.setIssuedAt(new Date()); //设置签发日期
builder.setExpiration(new Date(System.currentTimeMillis() + 5000)); //设置有效时间
builder.signWith(SignatureAlgorithm.HS256, "admin"); //设置签名 使用HS256算法,并设置SecretKey(字符串)
return builder.compact();
}
/**
* 解析jwt令牌存的用户数据
*
* @param jwtStr
* @throws Exception
*/
public static void parseJwt(String jwtStr) throws Exception {
Claims claims = Jwts.parser().setSigningKey("admin").parseClaimsJws(jwtStr).getBody();
System.out.println(claims);
}
}
4. 模块测试
I. 在 UserServiceImpl 类下添加生成 jwt 的方法
@Override
public Map<String, Object> findUserLogin(String code) {
Map<String, Object> dto = new HashMap<>();
User user = null;
if ("admin".equals(code)) {//测试数据
user = new User();
user.setId(1);
user.setUserCode("ddz");
user.setUserName("测试数据");
user.setUserPassword("123");
//生成jwt
String jwt = JwtUtil.createJWT(UUID.randomUUID().toString(), JSON.toJSONString(user), null);
System.out.println(jwt); //打印jwt令牌
dto.put("status", "1001");
dto.put("msg", "生成成功");
dto.put("token", jwt);
return dto;
}
dto.put("status", "1001");
dto.put("msg", "生成失败");
return dto;
}
II. 在 controller 暴露API 接口
IV. 在 Postman 上测试