JavaWebToken(JWT)的生成和解析

在网上搜了一大片关于JWT的,都没有讲清楚是怎么生成和解析的,今天来一波全过程。

JWT主要是是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

我这里是利用一个info.java的实体类来表示要传递的参数值,一般情况下我觉得利用Map传递参数的比较多 下面开始搭建: 首先你需要引入的jar包 jwt引入的jar

然后新建一个JwtUtils.java:

public class JwtUtils {
//得到subject
	public static String generalSubject(Info info){
        JSONObject jo = new JSONObject();
        jo.put("id", info.getId());
        jo.put("userid", info.getUserid());
        jo.put("key", info.getKey());
        return jo.toJSONString();
    }
//这里是传入值生成jwt
	public static String createJWT(String id, String issuer, String subject, long ttlMillis) {
		SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
		long nowMillis = System.currentTimeMillis();
		Date now = new Date(nowMillis);
		byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(Constant.JWT_SECRET);
		Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
		JwtBuilder builder = Jwts.builder().setId(id).setIssuedAt(now).setSubject(subject).setIssuer(issuer)
				.signWith(signatureAlgorithm, signingKey);
		if (ttlMillis >= 0) {
			long expMillis = nowMillis + ttlMillis;
			Date exp = new Date(expMillis);
			builder.setExpiration(exp);
		}
		return builder.compact();
	}
//解析jwt
	public static void parseJWT(String jwt) {
		Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(Constant.JWT_SECRET))
				.parseClaimsJws(jwt).getBody();
		System.out.println("ID: " + claims.getId());
		System.out.println("Subject: " + claims.getSubject());
		System.out.println("Issuer: " + claims.getIssuer());
		System.out.println("Expiration: " + claims.getExpiration());
	}
}

下面是我传递参数的一个类Info(可参考):

public class Info {
	
	private String id;
	private String userid;
	private String key;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}	
	public String getKey() {
		return key;
	}
	public void setKey(String key) {
		this.key = key;
	}	
}

下面是一些默认的配置,比如说过期时间,秘钥等信息:

public class Constant 
{
    public static final String JWT_ID = "jwttest";
    public static final String JWT_SECRET = "LLL blog";
    public static final int JWT_TTL = 60*60*1000;  //millisecond
    public static final int JWT_REFRESH_INTERVAL = 55*60*1000;  //millisecond
    public static final int JWT_REFRESH_TTL = 12*60*60*1000;  //millisecond
}

到这里的话基本上配置就齐全了,然后就是我们的主函数:

public class Main {
	public static void main(String[] args) throws Exception {
		Info info = new Info();
		info.setId("This is LLL  blog");
		info.setUserid("123456789");
		info.setKey("LLL丶禾羊  blog key value");
		String generalSubject = JwtUtils.generalSubject(info);	
		String token = JwtUtils.createJWT("oschina", "issuerdata", generalSubject, Constant.JWT_TTL);
		//输出token
		System.out.println(token);
		JwtUtils.parseJWT(token);
	}
}

执行主函数得到下面的结果: 输入图片说明

这里就生成完了,解密也执行完了,利用jwt一般是进行Api的开发,对安全性较高的系统推荐重新设置一套加密规则,本篇文章只是对jwt的运用做一个说明。

如果有不足的地方请大家指出,谢谢。输入图片说明

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SoXiaTea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值