JWT为 Json Web Token
,是一种令牌生成算法。使用JWT能够保证Token的安全性,且能够进行Token时效性的检验
JWT共由三部分组成,分别是数据头(Header)、Payload(数据体)、验证签名(Verify Signature)组成。其中,Header中的内容为加密信息以及Token的类别,Payload为用户数据、Verify Signature为校验数据。
maven引入依赖
com.auth0
java-jwt
3.8.2
io.jsonwebtoken
jjwt
0.9.1
新建JwtUtil的工具类
import io.jsonwebtoken.*;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JwtUtil {
private static final long EXPIRE = 60 * 1000; //过期时间
public static final String key = "thisiskey";
/**
* 生成token
*
* @param claims 要传送消息map,解析后可以通过get获取
* @return
*/
public static String generate(Map claims) {
Date nowDate = new Date();
//过期时间,设定为一分钟
Date expireDate = new Date(System.currentTimeMillis() + EXPIRE);
//头部信息,可有可无
Map header = new HashMap<>(2);
header.put("typ", "jwt");
return Jwts.builder().setHeader(header)
.setClaims(claims) //自定义claims
.setIssuedAt(nowDate)//当前时间
.setExpiration(expireDate) //过期时间
.signWith(SignatureAlgorithm.HS256, key)//签名算法和key
.compact();
}
/**
* 生成token
*
* @param header 传入头部信息map
* @param claims 要传送消息map
* @return
*/
public static String generate(Map header, Map claims) {
Date nowDate = new Date();
//过期时间,设定为一分钟
Date expireDate = new Date(System.currentTimeMillis() + EXPIRE);
return Jwts.builder().setHeader(header)
.setClaims(claims) //自定义claims
.setIssuedAt(nowDate)//当前时间
.setExpiration(expireDate) //过期时间
.signWith(SignatureAlgorithm.HS256, key)//签名算法和key
.compact();
}
/**
* 校验是不是jwt签名
*
* @param token
* @return
*/
public static boolean isSigned(String token) {
return Jwts.parser()
.setSigningKey(key)
.isSigned(token);
}
/**
* 校验签名是否正确
*
* @param token
* @return
*/
public static boolean verify(String token) {
try {
Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token);
return true;
} catch (ExpiredJwtException e) {
System.out.println("Token已过期!");
return false;
} catch (UnsupportedJwtException e) {
System.out.println("Token不合法!");
return false;
} catch (Exception e) {
System.out.println("Token不合法!");
return false;
}
}
/**
* 获取payload 部分内容(即要传的信息)
* 使用方法:如获取userId:getClaim(token).get("userId");
*
* @param token
* @return
*/
public static Claims getClaim(String token) {
Claims claims = null;
try {
claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
e.printStackTrace();
}
return claims;
}
/**
* 获取头部信息map
* 使用方法 : getHeader(token).get("alg");
*
* @param token
* @return
*/
public static JwsHeader getHeader(String token) {
JwsHeader header = null;
try {
header = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getHeader();
} catch (Exception e) {
e.printStackTrace();
}
return header;
}
/**
* 获取jwt发布时间
*/
public static Date getIssuedAt(String token) {
return getClaim(token).getIssuedAt();
}
/**
* 获取jwt失效时间
*/
public static Date getExpiration(String token) {
return getClaim(token).getExpiration();
}
/**
* 验证token是否失效
*
* @param token
* @return true:过期 false:没过期
*/
public static boolean isExpired(String token) {
try {
final Date expiration = getExpiration(token);
return expiration.before(new Date());
} catch (ExpiredJwtException expiredJwtException) {
return true;
}
}
/**
* 直接Base64解密获取header内容
*
* @param token
* @return
*/
public static String getHeaderByBase64(String token) {
String header = null;
if (isSigned(token)) {
try {
byte[] header_byte = Base64.getDecoder().decode(token.split("\\.")[0]);
header = new String(header_byte);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return header;
}
/**
* 直接Base64解密获取payload内容
*
* @param token
* @return
*/
public static String getPayloadByBase64(String token) {
String payload = null;
if (isSigned(token)) {
try {
byte[] payload_byte = Base64.getDecoder().decode(token.split("\\.")[1]);
payload = new String(payload_byte);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return payload;
}
public static void main(String[] args) {
Map claims = new HashMap<>();
claims.put("thisisusername", "username");
claims.put("thispassword", "password");
String token = JwtUtil.generate(claims);
System.out.println("token=" + token);
System.out.println("claims=" + JwtUtil.getClaim(token));
}
}
引入依赖
com.auth0
java-jwt
3.18.3
public class JwtUtil {
//指定一个token过期时间(毫秒)
// private static final long EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000; //7天
private static final long EXPIRE_TIME = 1000 * 60 * 10;
/**
* 生成token
*/
//注意这里的key不是密码,而是进行三件套(salt+MD5+1024Hash)处理密码后得到的凭证
public static String createJwtToken(String username, String key) {
Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
Algorithm algorithm = Algorithm.HMAC256(secret); //使用密钥进行哈希
// 附带username信息的token
return JWT.create()
.withClaim("username", username)
.withExpiresAt(date) //过期时间
.sign(algorithm); //签名算法
}
/**
* 校验token是否正确
*/
public static boolean verifyToken(String token, String username, String key) {
try {
//根据密钥生成JWT效验器
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm)
.withClaim("username", username)
.build();
//效验TOKEN(其实也就是比较两个token是否相同)
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception exception) {
return false;
}
}
/**
* 在token中获取到username信息
*/
public static String getUsername(String token) {
try {
DecodedJWT jwt = JWT.decode(token);
return jwt.getClaim("username").asString();
} catch (JWTDecodeException e) {
return null;
}
}
/**
* 判断是否过期
*/
public static boolean isExpire(String token) {
DecodedJWT jwt = JWT.decode(token);
return jwt.getExpiresAt().getTime() < System.currentTimeMillis();
}
}
参考:
Java使用JWT_java jwt_SuperXMing的博客-CSDN博客
java-jwt工具类_南风知易✓✓✓的博客-CSDN博客