JWT令牌
案例:mysc-parent3
1. 在公共模块添加依赖
<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;
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);
if (ttlMillis == null) {
ttlMillis = JwtUtil.JWT_TTL;
}
long expMillis = nowMillis + ttlMillis;
Date expDate = new Date(expMillis);
SecretKey secretKey = generalKey();
JwtBuilder builder = Jwts.builder()
.setId(id)
.setSubject(subject)
.setIssuer("admin")
.setIssuedAt(now)
.signWith(signatureAlgorithm, secretKey)
.setExpiration(expDate);
return builder.compact();
}
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();
}
}
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);
}
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'}");
builder.addClaims(userInfo);
builder.setIssuedAt(new Date());
builder.setExpiration(new Date(System.currentTimeMillis() + 5000));
builder.signWith(SignatureAlgorithm.HS256, "admin");
return builder.compact();
}
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");
String jwt = JwtUtil.createJWT(UUID.randomUUID().toString(), JSON.toJSONString(user), null);
System.out.println(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 上测试