import io.jsonwebtoken.*;

    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
    import java.security.Key;
    import java.util.Date;

    public class TokenUtils {

    1. _/**_<br />_ * 签名秘钥_<br />_ */_<br />_ _public static final String _SECRET _= "haoxy";
    2. _/**_<br />_ * 生成atoken_<br />_ *_<br />_ * _**_@param _**_id 一般传入userName_<br />_ * _**_@return_**<br />**_ _**_*/_<br />_ _public static String createJwtToken(String id) {<br /> String issuer = "atoken";<br /> String subject = "atoken@admin";<br /> long ttlMillis = System._currentTimeMillis_();<br /> return _createJwtToken_(id, issuer, subject, ttlMillis);<br /> }
    3. _/**_<br />_ * 生成 rtoken_<br />_ *_<br />_ * _**_@param _**_id_<br />_ * _**_@return_**<br />**_ _**_*/_<br />_ _public static String createJwtrToken(String id) {<br /> String issuer = "rtoken";<br /> String subject = "rtoken@admin";<br /> long ttlMillis = System._currentTimeMillis_();<br /> return _createJwtToken_(id, issuer, subject, ttlMillis);<br /> }
    4. _/**_<br />_ * 生成Token_<br />_ *_<br />_ * _**_@param _**_id 编号_<br />_ * _**_@param _**_issuer 该JWT的签发者,是否使用是可选的_<br />_ * _**_@param _**_subject 该JWT所面向的用户,是否使用是可选的;_<br />_ * _**_@param _**_ttlMillis 签发时间_<br />_ * _**_@return _**_token String_<br />_ */_<br />_ _public static String createJwtToken(String id, String issuer, String subject, long ttlMillis) {
    5. // 签名算法 ,将对token进行签名<br /> SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm._HS256_;
    6. // 生成签发时间<br /> long nowMillis = System._currentTimeMillis_();<br /> Date now = new Date(nowMillis);
    7. // 通过秘钥签名JWT<br /> byte[] apiKeySecretBytes = DatatypeConverter._parseBase64Binary_(_SECRET_);<br /> Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
    8. // 设置JWT声明<br /> // long time = now.getTime() + 1000 * 60; //1分钟,用于测试使用, 生产环境在 * 60<br /> long time = now.getTime() + 1000 * 60 * 90;// 90 分钟<br /> JwtBuilder builder = Jwts._builder_().setId(id)<br /> .setIssuedAt(now)<br /> .setSubject(subject)<br /> .setExpiration(new Date(time))<br /> .setIssuer(issuer)<br /> .signWith(signatureAlgorithm, signingKey);
    9. // 添加过期时间<br /> if ("rtoken@admin".equals(subject)) {<br /> Date exp = new Date(new Date(System._currentTimeMillis_()).getTime() + 2500 * 36000 * 7); //7天,用于生产环境<br /> //Date exp = new Date(new Date(System.currentTimeMillis()).getTime() + 2000 * 60); //2分钟 用于测试<br /> builder.setExpiration(exp);<br /> }
    10. // 构建JWT并将其序列化为紧凑的URL安全字符串<br /> return builder.compact();
    11. }
    12. // 验证和读取JWT的示例方法<br /> public static Claims parseJWT(String jwt) {<br /> // 如果它不是签名的JWS(如预期的那样),则该行将抛出异常
    13. Claims claims = Jwts._parser_()<br /> .setSigningKey(DatatypeConverter._parseBase64Binary_(_SECRET_))<br /> .parseClaimsJws(jwt).getBody();<br /> return claims;<br /> }