编码token以登录(JJWT框架)
导入依赖↓
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<!-- java高版本不自带javax.xml.bind等依赖,需导入 -->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>4.0.2</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
导入依赖后再如前面学习的那样导入项目库↓
导入所有依赖项目库,不止图中这一个,选择全部导入就好
创建Jjwt类↓
import io.jsonwebtoken.*;
import java.util.*;
public class Jjwt {
private static String iss = "virtualtravel";//保存iss值
private static int expiration = 60*60; //保存exp,单位秒
private Claims claims = null; //保存解析后得到的jwt值
private String secret = "自定义密匙";//Jjwt加密所用密匙
/**
* 创建jwt
* @return
* 返回生成的jwt token
*/
public String generateJwtToken(){
// 头部 map,Jwt的头部承载,第一部分
// 可不设置 默认格式是{"alg":"HS256"}
Map<String, Object> map = new HashMap<>();
map.put("alg", "HS256");
map.put("typ", "JWT");
//载荷 claims,Jwt的载荷,第二部分
Map<String,Object> claims = new HashMap<String,Object>();
/*标准中注册的声明 (建议但不强制使用)
一旦写标准声明赋值之后,就会覆盖了那些已存在的标准声明*/
claims.put("iss", iss);
claims.put("sub", "sub");
/*claims.put("exp", new Date(System.currentTimeMillis() + 1)); //直接设置格式会错误,通过setExpiration设置
claims.put("iat", new Date());*/
claims.put("jti", UUID.randomUUID().toString());
/* 默认7个字段
iss: jwt签发者
sub: jwt所面向的用户
aud: 接收jwt的一方
exp: jwt的过期时间,这个过期时间必须要大于签发时间
nbf: 定义在什么时间之前,该jwt都是不可用的.
iat: jwt的签发时间
jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击
*/
//私有声明 自定义数据,根据业务需要添加
claims.put("uAccount","uAccount");
//下面就是在为payload添加各种标准声明和私有声明了
return Jwts.builder() // 这里其实就是new一个JwtBuilder,设置jwt的body
.setHeader(map) // 头部信息
.setClaims(claims) // 载荷信息
//.setSubject(uAccount) //设置sub:代表这个jwt所面向的用户
.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)) // 设置exp:jwt过期时间
//.setId(UUID.randomUUID().toString()) // 设置jti(JWT ID):是JWT的唯一标识,从而回避重放攻击。
.setIssuedAt(new Date()) // 设置iat: jwt的签发时间 . */
.signWith(SignatureAlgorithm.HS256, secret.getBytes())//设置签名:通过签名算法和秘钥生成签名
.compact(); // 开始压缩为xxxxx.yyyyy.zzzzz 格式的jwt token
}
//解析JwtToken
public Claims getClaimsFromJwt(String token) {
try {
claims = Jwts.parser().setSigningKey(propertiesService.getSecret().getBytes()).parseClaimsJws(token).getBody();
claims.put("token", token);
/*SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println("签发时间:"+sdf.format(claims.getIssuedAt()));
System.out.println("过期时间:"+sdf.format(claims.getExpiration()));
System.out.println("当前时间:"+sdf.format(new Date()) );*/
}catch (ExpiredJwtException e) {//解析时,若过期则异常
e.printStackTrace();
}catch (UnsupportedJwtException e) {//解析时若不支持Jwt则异常
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return claims;
}
}