创建和解析token需要用到的jar包:jjwt-0.6.0.jar
jar下载链接: https://pan.baidu.com/s/1Vb-Ylxm0tAS97Gu5MOO8sw 提取码:t4x9
(含依赖包,以及下文中的2个java文件)
辅助类:JwtUser.java
import java.io.Serializable;
/**
* 用来存token的
* @date 2017年7月14日 下午1:53:05
* @author yqwang0907
*/
public class JwtUser implements Serializable{
private static final long serialVersionUID = 8715844912534284943L;
private String id;
private String uname;
private Long loginTime;//登录时间
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Long getLoginTime() {
return loginTime;
}
public void setLoginTime(Long loginTime) {
this.loginTime = loginTime;
}
}
工具类JwtHelper.java
import java.security.Key;
import java.util.Date;
import java.util.UUID;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.json.JSONObject;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
//添加构成JWT的参数 头部+载荷+签名。
//头部(Header){"typ": "JWT","alg": "HS256"}
/*载荷(Payload)
{ "iss": "Online JWT Builder", //iss(Issuser):代表这个JWT的签发主体;
"iat": 1416797419, //iat(Issued at):是一个时间戳,代表这个JWT的签发时间;
"exp": 1448333419, //exp(Expiration time):是一个时间戳,代表这个JWT的过期时间;
"aud": "www.example.com", //aud(Audience):代表这个JWT的接收对象;
"sub": "jrocket@example.com", //sub(Subject):代表这个JWT的主体,即它的所有人;
"GivenName": "Johnny",
"Surname": "Rocket",
"Email": "jrocket@example.com",
"Role": [ "Manager", "Project Administrator" ]
}*/
//签名(Signature)
public class JwtHelper {
public static final String secret = "22640E66C97339C027F77759025CAD17";
/**
* 由字符串生成加密key
* @param secret 当前用户的secret(MD5字符串)
* @return
*/
public static SecretKey generalKey(String secret){
byte[] encodedKey = Base64.decodeBase64(secret);
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
/**
* 解密jwt
* @param jsonWebToken
* @param secret 当前用户的secret
* @return
*/
public static Claims parseJWT(String jsonWebToken) {
SecretKey key = generalKey(secret);
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(jsonWebToken)
.getBody();
return claims;
}
/**
* 创建jwt
* @param uid 用户id
* @param subject 用户信息转成的json
* @param TTLMillis 过期时间毫秒
* @param secret
* @return
*/
public static String createJWT(String uid,String subject,long TTLMillis, String secret) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
// 生成签名密钥
Key signingKey = generalKey(secret);
JwtBuilder builder = Jwts.builder()
.setHeaderParam("typ", "JWT")
.claim("userid", uid)
.setIssuedAt(now)//iat(issued at): 在什么时候签发的(UNIX时间),是否使用是可选的;
.setSubject(subject)//sub: 该JWT所面向的用户,是否使用是可选的;
//.setIssuer(issuer)//iss: 该JWT的签发者,是否使用是可选的;
//.setAudience(audience)//aud: 接收该JWT的一方,是否使用是可选的;
.signWith(signatureAlgorithm, signingKey);//
// 添加Token过期时间
if (TTLMillis >= 0) {
long expMillis = nowMillis + TTLMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);//exp(expires): 什么时候过期,这里是一个Unix时间戳,是否使用是可选的;
//.setNotBefore(now);//nbf (Not Before):如果当前时间在nbf里的时间之前,则Token不被接受;一般都会留一些余地,比如几分钟;,是否使用是可选的;
}
// 生成JWT
return builder.compact();
}
/**
* 生成subject信息
* @param user
* @return
*/
public static String generalSubject(JwtUser user){
JSONObject jo = new JSONObject(user);
return jo.toString();
}
/**
* 创建token:通过登录后的用户,生产token,有效时间60分钟
* @param JwtUser {id,uname}
* @return
*/
public static String createJWT(JwtUser uvo){
uvo.setLoginTime(System.currentTimeMillis());
String subject = JwtHelper.generalSubject(uvo);
String accessToken = JwtHelper.createJWT(uvo.getId(), subject, 60 * 60 * 1000, secret);
return accessToken;
}
public static void main(String[] args) {
JwtUser u = new JwtUser();
u.setId(UUID.randomUUID().toString());
u.setUname("0001");
// 拼装accessToken
System.out.println("创建token:");
String accessToken = JwtHelper.createJWT(u);
System.out.println(accessToken);
// 解析accessToken
System.out.println("解析toke:");
Claims r = JwtHelper.parseJWT(accessToken);
System.out.println(r.toString());
String s = r.getSubject();
Object usrid = r.get("userid");
System.out.println(usrid);
JSONObject jo = new JSONObject(s);
System.out.println(jo.get("id"));
}
}
运行JwtHelper.java中的main()方法,测试效果:
创建token:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyaWQiOiJiYjk4YjQ0Zi0wNDg3LTQ5YzItYjY1Mi00N2IzMzExMzJkYWQiLCJpYXQiOjE1Mzk5NDA1MzQsInN1YiI6IntcImxvZ2luVGltZVwiOjE1Mzk5NDA1MzQzODIsXCJ1bmFtZVwiOlwiMDAwMVwiLFwiaWRcIjpcImJiOThiNDRmLTA0ODctNDljMi1iNjUyLTQ3YjMzMTEzMmRhZFwifSIsImV4cCI6MTUzOTk0NDEzNH0.H2vyW4gitPrU5qXQJo_3t7uJNht7OEvvGKnlhVWUy-k
解析toke:
{userid=bb98b44f-0487-49c2-b652-47b331132dad, iat=1539940534, sub={"loginTime":1539940534382,"uname":"0001","id":"bb98b44f-0487-49c2-b652-47b331132dad"}, exp=1539944134}
bb98b44f-0487-49c2-b652-47b331132dad
bb98b44f-0487-49c2-b652-47b331132dad