jar : maven
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.6.0</version> </dependency>
java 代码实现
package com.zmt.payment.util; import com.alibaba.druid.support.json.JSONUtils; 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; /** * @CLASSNAME :JwtUtils * @Description :Tokens 生成工具 * @Author :Mr.薛 * @Data :2018/12/20 0020 15:44 * @Version :V1.0 * @Status : 编写 **/ public class JwtUtils { /** * 解析JWT * @param jsonWebToken * @param base64Security * @return */ public static Claims parseJWT(String jsonWebToken, String base64Security) { try { Claims claims = Jwts.parser() .setSigningKey(DatatypeConverter.parseBase64Binary(base64Security)) .parseClaimsJws(jsonWebToken).getBody(); return claims; } catch (Exception ex) { return null; } } /** * 创建JWT * @param no * @param userId * @param issuer * @param TTLMillis * @param base64Security * @return */ /*token的过期时间用秒来计算*/ public static String createJWT(String no, String userId,String issuer, long TTLMillis, String base64Security) { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); //生成签名密钥 byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(base64Security); Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); //添加构成JWT的参数 /* Payload Payload 里面是 Token 的具体内容,这些内容里面有一些是标准字段,你也可以添加其它需要的内容。下面是标准字段: iss:Issuer,发行者 sub:Subject,主题 aud:Audience,观众 exp:Expiration time,过期时间 nbf:Not before iat:Issued at,发行时间 jti:JWT ID 比如下面这个 Payload ,用到了 iss 发行人,还有 exp 过期时间这两个标准字段。另外还有两个自定义的字段,一个是 name ,还有一个是 admin 。 { "iss": "ninghao.net", "exp": "1438955445", "name": "wanghao", "admin": true }*/ JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT") .claim("no", no) .setSubject(userId) .setIssuer(issuer) .signWith(signatureAlgorithm, signingKey); //添加Token过期时间 if (TTLMillis >= 0) { long expMillis = nowMillis + TTLMillis; Date exp = new Date(expMillis); builder.setExpiration(exp).setNotBefore(now); } //生成JWT return builder.compact(); } public static void main(String[] args) { /*测试数据*/ long time = 180;/*过期时间3分钟*/ System.out.println(System.currentTimeMillis()); String auth = createJWT(time+"s","userId","issuer",time,"base64Security"); System.out.println("auth:"+auth); Claims m = parseJWT(auth,"base64Security"); System.out.println(JSONUtils.toJSONString(m)); } }
在数据的验证这里如果是http接口的话最好通过头文件讲token绑定,作为数据传输的第一步验证,接口类数据的过期时间最好不要超过1分钟,用户登录的过期时间同步授权时间,用户注销之后释放token