JJWT全称就是java Json web token。JJWT是一个提供端到端的JWT创建和验证的java库。
【pom文件依赖】
<!--引入jjwt生成token-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.6.0</version>
</dependency>
1、生成token
代码如下
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
/**
* JJWT生成token
**/
public class CreateToken {
public static void main(String[] args) {
//Jwts.builder()表示创建
JwtBuilder builder= Jwts.builder().setId("16") //setId一般是用户id
.setSubject("可非") //
.setIssuedAt(new Date()) //setIssuedAt用于设置签发时间
.signWith(SignatureAlgorithm.HS256,"kefei"); //signWith设置签名的秘钥
System.out.println(builder.compact());
}
}
以上代码生成的token:eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxNiIsInN1YiI6IuWPr-mdniIsImlhdCI6MTU0NDA3OTM3OH0.eeNG-3sC4Qe-LDFaTIxdDbZ6VIg-8rXAYOPPx1ZZ1Dg
【注意】我们发现每次运行就会生成的token值都不一样
2、解析token
在上一节中生成了token,在web应用中这个操作时由服务器端进行然后发送给客户端,客户端在下次向服务端发送请求时需要携带这个token进行验证,那服务端接收到这个token之后应该是解析出token中的信息,如用户id,用户名称,用户角色等信息。
/**
* 解析token
**/
public class ParseToken {
public static void main(String[] args) {
String token="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxNiIsInN1YiI6IuWPr-mdniIsImlhdCI6MTU0NDA3OTM3OH0.eeNG-3sC4Qe-LDFaTIxdDbZ6VIg-8rXAYOPPx1ZZ1Dg";
Claims claims =
Jwts.parser().setSigningKey("kefei").parseClaimsJws(token).getBody();
System.out.println("用户id:"+claims.getId());
System.out.println("Subject用户名:"+claims.getSubject());
System.out.println("IssuedAt签发时间:"+claims.getIssuedAt());
}
}
【解析的结果】
3、token的过期校验
/**
* JJWT生成token,含过期时间
**/
public class CreateTokenExp {
public static void main(String[] args) {
//得到当前时间,打我是毫秒
long now = System.currentTimeMillis();
long exp = now+1000*60;//设置过期时间为1分钟
//Jwts.builder()表示创建
JwtBuilder builder= Jwts.builder().setId("16") //setId一般是用户id
.setSubject("可非") //
.setIssuedAt(new Date()) //setIssuedAt用于设置签发时间
.signWith(SignatureAlgorithm.HS256,"kefei")
.setExpiration(new Date(exp)) //设置token的过期时间
; //signWith设置签名的秘钥
System.out.println(builder.compact());
}
}
【解析过期token的提示】
4、自定义claims
【自定义生成token】
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
/**
* 自定义token
**/
public class CustomToken {
public static void main(String[] args) {
//得到当前时间,打我是毫秒
long now = System.currentTimeMillis();
long exp = now+1000*60*60;//设置过期时间为1分钟
JwtBuilder builder = Jwts.builder().setId("103")//用户id
.setSubject("张三丰") //用户名称
.setIssuedAt(new Date())//token签发时间
.signWith(SignatureAlgorithm.HS256, "kefei")
.setExpiration(new Date(exp))//token过期时间
.claim("roles", "admin")//用户角色信息
.claim("logo", "logo.png");//用户图像
System.out.println("token:"+builder.compact());
}
}
【解析自定义token】
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 解析token
**/
public class ParseToken {
public static void main(String[] args) {
String token=
"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMDMiLCJzdWIiOiLlvKDkuInkuLAiLCJpYXQiOjE1NDQwODEzNjQsImV4cCI6MTU0NDA4NDk2Mywicm9sZXMiOiJhZG1pbiIsImxvZ28iOiJsb2dvLnBuZyJ9.llJe0YjkeVmUKjC4l_1kYAD33MqpHRvPZrQ2zRgj0zc";
Claims claims =
Jwts.parser().setSigningKey("kefei").parseClaimsJws(token).getBody();
System.out.println("用户id:"+claims.getId());
System.out.println("Subject用户名:"+claims.getSubject());
System.out.println("roles:"+claims.get("roles"));
System.out.println("logo:"+claims.get("logo"));
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()));
}
}