小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动
maven依赖 jar
<!-- jwt util -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
核心代码
import io.jsonwebtoken.*;
import javax.xml.bind.DatatypeConverter;
import java.util.Date;
import java.util.List;
/**
* json web token相关工具类
*
* @author Tarzan liu
* @date 16:29 2018/3/8
*/
public class JsonWebTokenUtil {
/**
* 默认SUBJECT加密解密签名KEY
**/
private static final String DEFAULT_SECRET_KEY = "?::4390fsf4sdl6opf):";
/**
* JWT格式3个点
**/
private static final int COUNT_3 = 3;
/**
* 加密解密签名
**/
private static String secretKey;
static {
secretKey = DEFAULT_SECRET_KEY;
}
/**
* json web token 签发
*
* @param id 令牌ID
* @param subject 用户ID
* @param issuer 签发人
* @param period 有效时间(毫秒)
* @param roles 访问主张-角色
* @param permissions 访问主张-权限
* @param isRefresh 是否是刷新token
* @param algorithm 加密算法
* @return java.lang.String jwt
*/
public static String issueJwt(String id, String subject, String issuer, Long period,
List<String> roles, List<String> permissions,
Boolean isRefresh, SignatureAlgorithm algorithm) {
// 当前时间戳
long currentTimeMillis = System.currentTimeMillis();
// 秘钥
byte[] secretKeyBytes = DatatypeConverter.parseBase64Binary(secretKey);
JwtBuilder jwtBuilder = Jwts.builder();
if (id != null) {
jwtBuilder.setId(id);
}
if (subject != null) {
jwtBuilder.setSubject(subject);
}
if (issuer != null) {
jwtBuilder.setIssuer(issuer);
}
// 设置签发时间
jwtBuilder.setIssuedAt(new Date(currentTimeMillis));
// 设置到期时间
if (null != period) {
jwtBuilder.setExpiration(new Date(currentTimeMillis + period * 1000));
}
if (roles != null) {
jwtBuilder.claim("roles", roles);
}
if (permissions != null) {
jwtBuilder.claim("perms", permissions);
}
if (isRefresh != null) {
jwtBuilder.claim("isRefresh", isRefresh);
}
// 压缩,可选GZIP
jwtBuilder.compressWith(CompressionCodecs.DEFLATE);
// 加密设置
jwtBuilder.signWith(algorithm, secretKeyBytes);
return jwtBuilder.compact();
}
/**
* 判断其是否是JWT,这里主要用格式来判断,不校验
*
* @param jwt JWT TOKEN
* @return 为JWT返回false 否则 true
*/
public static boolean isNotJsonWebToken(String jwt) {
// base64url_encode(Header) + '.' + base64url_encode(Claims) + '.' + base64url_encode(Signature)
return jwt.split("\\.").length != COUNT_3;
}
/**
* @param jwt json web token
* @return 解签实体
* @throws ExpiredJwtException token过期
* @throws UnsupportedJwtException 不支持的TOKEN
* @throws MalformedJwtException 参数格式形变等异常
* @throws SignatureException 签名异常
* @throws IllegalArgumentException 非法参数
*/
public static Claims parseJwt(String jwt) throws ExpiredJwtException, UnsupportedJwtException, MalformedJwtException, SignatureException, IllegalArgumentException {
return Jwts.parser()
.setSigningKey(DatatypeConverter.parseBase64Binary(secretKey))
.parseClaimsJws(jwt)
.getBody();
// 令牌ID -- claims.getId()
// 客户标识 -- claims.getSubject()
// 客户标识
// 签发者 -- claims.getIssuer()
// 签发时间 -- claims.getIssuedAt()
// 接收方 -- claims.getAudience()
// 访问主张-角色 -- claims.get("roles", String.class)
// 访问主张-权限 -- claims.get("perms", String.class)
}
/**
* 设置新的JWT加密解密签名
*
* @param secretNowKey 签名KEY
*/
public static void setSecretKey(String secretNowKey) {
secretKey = secretNowKey;
}
}