1 引入pom文件
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.8.3</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
在控制器同级包下新建JWT.java文件
不是同一包下应该也可以,只是我学的时候是放在同包下了,方便引入
//下面是需要的包,当时刚开始学的时候很多都是一个个试出来的,太难了
import cn.jeefast.modules.platform.entity.Nuser;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class JWT {
//https://www.cnblogs.com/jimisun/p/9482439.html
//创建token
public static String createJWT(long ttlMillis,Nuser nuser){//Nuser是数据库中的表明(也就是实体)
//指定签名的时候使用的算法
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//生成jwt的时间
long nowMills = System.currentTimeMillis();
Date now = new Date(nowMills);
//创建payload的私有声明
Map<String, Object> claims = new HashMap<>();
claims.put("uid",nuser.getUid());//获取id
claims.put("name",nuser.getUname());//获取姓名
claims.put("pwd",nuser.getPwd());//获取密码,但实际操作中为了安全一般不会保存密码,可以保存一个唯一的id
//下面的注释是原文的注释,因为不会封装,就直接用密码代替了
//生成签名的时候使用的秘钥secret,这个方法本地封装了的,一般可以从本地配置文件中读取,切记这个秘钥不能外露哦。
// 它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
String key = nuser.getPwd();
//生成签发人
String subject = nuser.getUname();
//下面就是在为payload添加各种标准声明和私有声明了
JwtBuilder builder = Jwts.builder()
//如果有私有声明,一定要先设置这个自己创建的私有的声明,
// 这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
.setClaims(claims)
.setId(UUID.randomUUID().toString())//设置一个不重复的值,主要用来作为一次性token,从而回避重放攻击
.setIssuedAt(now)
.setSubject(subject)
.signWith(signatureAlgorithm,key);
if(ttlMillis >= 0){
long expMillis = nowMills + ttlMillis;
Date exp = new Date(expMillis);
//设置过期时间
builder.setExpiration(exp);
}
return builder.compact();
}
/**
*
* token解密
*
*/
public static Claims parseJwt(String token,Nuser nuser){
//签名密钥,和生成的签名密钥一模一样
String key = nuser.getPwd();
Claims claims = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token).getBody();
return claims;
}
/**
* 校验token
*/
public static Boolean isVerify(String token,Nuser nuser) {
String key = nuser.getPwd();
Claims claims = Jwts.parser()
.setSigningKey(key)//设置签名的密钥
.parseClaimsJws(token).getBody();//设置需要解析的jwt
if(claims.get("pwd").equals((nuser.getPwd()))){
return true;
}
return false;
}
}
controller层的实际应用(只有加密,没有解密)
/**
* jwt验证,生成token
*/
@RequestMapping(value = "yzlogin")
public Object yzlogin (){
JSONObject jsonObject = new JSONObject();
//用户的密码不可以太简单,过于简单会报错,报错内容如下
//secret key byte array cannot be null or empty.
Nuser nuser = nuserService.byName("admin");
if(nuser == null){
jsonObject.put("message","登陆失败,用户名错误");
return jsonObject;
}else {
String token = JWT.createJWT(6000000,nuser);//设置有效时间
jsonObject.put("token",token);//临时生成的token
jsonObject.put("nuser",nuser);//报错根据用户名查询到的内容
return jsonObject;
}