关于 jwt 的生成,解析,更新 等功能
需要导入的 jar 包:
1. jjwt-.6.0.jar
2. jackson-core-2.9.6.jar
3. jackson-databind-2.9.6.jar
4. jackson-annotations-2.9.6.jar
package common;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Date;
/**
* @author lenovo
* @date 2018/7/2
*/
public class JWTUtils {
private final static String key = "XXX";
private final static long keep_time = 7 * 24 * 60 * 60 * 1000;//设置登录过期时间为 一周
/**
* 获取密钥
*
* @return
*/
private static Key getKeyInstance() {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(key);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
return signingKey;
}
/**
* 生成 jwt
*
* @param id
* @param subject
* @return
*/
public static String createJWT(String id, String subject) {
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
JwtBuilder builder = Jwts.builder() //设置jwt的body
.setId(id)//设置jti(JWT ID):是JWT的唯一标识,根据业务需要,这个可以设置为一个不重复的值,主要用来作为一次性token,从而回避重放攻击。
.setIssuedAt(now)//jwt的签发时间
.setSubject(subject)//代表这个JWT的主体,即它的所有人,这个是一个json格式的字符串
.signWith(SignatureAlgorithm.HS256, getKeyInstance());//设置签名使用的签名算法和签名使用的秘钥
long ttMillis = keep_time;
if (ttMillis >= 0) {
long expMillis = nowMillis + ttMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);//设置过期时间
}
return builder.compact();
}
/**
* 解析 jwt
*
* @param jwt
* @return
*/
public static Claims verifyJWT(String jwt) {
Claims jwtClaims = Jwts.parser()//得到DefaultJwtParser
.setSigningKey(getKeyInstance())//设置签名的秘钥
.parseClaimsJws(jwt).getBody();////设置需要解析的jwt
return jwtClaims;
}
/**
* jwt过期时,重新生成新的 jwt
*
* @param token
* @return
*/
public String updateJWT(String token) {
try {
Claims claims = verifyJWT(token);
String id = claims.getId();
String subject = claims.getSubject();
return createJWT(id, subject);
} catch (Exception ex) {
ex.printStackTrace();
}
return "0";
}
}
参考:
1. WEB后台–基于Token的WEB后台登录认证机制(并讲解其他认证机制以及cookie和session机制)
2. JWT的Java使用 (JJWT)
3. jjwt github
4. springmvc跨域+token验证(app后台框架搭建二)