一、代码展示
@Component
public class JwtUtil {
// 有效期
private static final long JWT_EXPIRE = 12*60*60*1000L; //12小时
// 令牌秘钥
private static final String JWT_KEY = "glxy2019zx";
public String createToken(Object data){
// 当前时间
long currentTime = System.currentTimeMillis();
// 过期时间
long expTime = currentTime+JWT_EXPIRE;
// 构建jwt
JwtBuilder builder = Jwts.builder()
.setId(UUID.randomUUID()+"")
.setSubject(JSON.toJSONString(data))
.setIssuer("system")
.setIssuedAt(new Date(currentTime))
.signWith(SignatureAlgorithm.HS256, encodeSecret(JWT_KEY)) //对称加密, 对密匙转码
.setExpiration(new Date(expTime));
return builder.compact();
}
private SecretKey encodeSecret(String key){
byte[] encode = Base64.getEncoder().encode(key.getBytes());
SecretKeySpec aes = new SecretKeySpec(encode, 0, encode.length, "AES");
return aes;
}
public Claims parseToken(String token){
Claims body = Jwts.parser()
.setSigningKey(encodeSecret(JWT_KEY))
.parseClaimsJws(token)
.getBody();
return body;
}
public <T> T parseToken(String token,Class<T> clazz){
Claims body = Jwts.parser()
.setSigningKey(encodeSecret(JWT_KEY))
.parseClaimsJws(token)
.getBody();
return JSON.parseObject(body.getSubject(),clazz);
}
}
二、pom文件
<!-- jwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
三、JWT
1、 什么是JWT?
JWT(json web token),它并不是一个具体的技术实现,而更像是一种标准。
JWT规定了数据传输的结构,一串完整的JWT由三段落组成,每个段落用英文句号连接(.)连接,他们分别是:Header、Payload、Signature,所以,常规的JWT内容格式是这样的:AAA.BBB.CCC
并且,这一串内容会base64加密;也就是说base64解码就可以看到实际传输的内容。接下来解释一下这些内容都有什么作用。
Header
Header包含加密的方式、type。
Payload
Payload这里就会包含实际传递的参数内容。记住,在这里不要传递那些很敏感的数据,因为只要base64解码就可以看到,除非你还额外加密一层。
Signature
它主要决定了Header、Payload有没有被人篡改;如果内容被篡改,那么这条JWT将会被视为无效。
2、应用场景
基本上绝大部分的人都用JWT做登录授权,它相比原先的session、cookie来说,更快更安全,跨域也不再是问题,更关键的是更加优雅~
当然它也可以用来传递数据,只不过我个人觉得做传输不太好用(实际上我想市场也这么觉得),原因几点:
1、如果是公开展示数据的话,我何必先加签才返回呢?
2、如果是私密数据的话,人家base64解码就能看到,不合适吧?即便我把payload内容加密,可这样一来就加密好几次了,我直接用别的加密手段它不香么?
或许是目前的业务需求并没有很契合。