复制过来即可用的JWT小Demo
程序员文章站
2022-06-13 20:06:16
...
前言
这里不具体讲解JWT是什么,有什么应用场景,只是一个简单的小Demo,可以直接复制到eclipse上直接运行的,后续文章中再来详细介绍下JWT的优势和应用场景以及在单点登录上的应用。
导入jar包
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
具体测试代码
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
/**
* @ClassName: JwtUtil
* @Description: JWT小Demo
* @author aiqinhai
* @date 2018年4月26日
*/
public class JwtUtil {
/**
* 创建jwt
* @param id
* @param subject
* @param ttlMillis 过期的时间长度
* @return
* @throws Exception
*/
public String createJWT(String id, String subject, long ttlMillis) throws Exception {
//指定签名的时候使用的签名算法
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//生成JWT的时间
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
Map<String,Object> claims = new HashMap<String,Object>();
claims.put("uid", "uniqueID");
claims.put("user_name", "admin");
claims.put("nick_name","jiangmofeng");
SecretKey key = generalKey();
//为payload添加各种标准声明和私有声明了
JwtBuilder builder = Jwts.builder()
//如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值
//一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
.setClaims(claims)
//设置jti(JWT ID):是JWT的唯一标识,从而回避重放攻击。
.setId(id)
.setIssuedAt(now)
//sub代表这个JWT的主体,即它的所有人。
.setSubject(subject)
//设置签名使用的签名算法和签名使用的秘钥
.signWith(signatureAlgorithm, key);
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
return builder.compact();
}
/**
* 解密jwt
* @param jwt
* @return
* @throws Exception
*/
public Claims parseJWT(String jwt) throws Exception{
SecretKey key = generalKey(); //签名秘钥,和生成的签名的秘钥一模一样
Claims claims = Jwts.parser() //得到DefaultJwtParser
.setSigningKey(key) //设置签名的秘钥
.parseClaimsJws(jwt).getBody();//设置需要解析的jwt
return claims;
}
/**
* 由字符串生成加密key
* @return
*/
public SecretKey generalKey(){
String stringKey = "aiqinhai";
byte[] encodedKey = Base64.decodeBase64(stringKey);//本地的密码解码[aaa@qq.com
// 根据给定的字节数组使用AES加密算法构造一个**
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
public static void main(String[] args){
JwtUtil util= new JwtUtil();
String ab=null;
try {
ab = util.createJWT("jwt", "{id:100,name:aiqinhai}", 600000);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("签名之后的JWT:"+ab);
String jwt=ab;
Claims c=null;
try {
c = util.parseJWT(jwt);
//注意:如果jwt已经过期了,这里会抛出jwt过期异常。
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(c.getId());
System.out.println(c.getIssuedAt());
System.out.println(c.getSubject());
System.out.println("获取私有声明中的nick_name:"+c.get("nick_name"));
System.out.println("获取私有声明中的user_name:"+c.get("user_name"));
System.out.println(c.get("uid", String.class));
}
}
测试效果
传送门
上一篇: 新里程碑到来 开启PHP框架的新时代(1)_PHP教程
下一篇: 请教这段语句有什么东东
推荐阅读