token工具类


创建和解析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": "[email protected]", //sub(Subject):代表这个JWT的主体,即它的所有人;
  "GivenName": "Johnny", 
  "Surname": "Rocket", 
  "Email": "[email protected]", 
  "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

 

你可能感兴趣的:(java)