入门案例
因为网上的介绍是在是太多了,基本上大同小异.我在牛角尖里还没钻出来,暂时不写概念性东西.正文开始
package com.JWT;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.Test;
import java.util.Calendar;
import java.util.HashMap;
public class JwtDemo {
/**
* TODO JWT的格式:头.载荷.签名 格式如下
* eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
* .eyJ1c2VyMSI6MTIzLCJleHAiOjE2MjIyMTA2NTAsInVzZXIiOiLlronmmJ8ifQ
* .7cPzFyPt3udl9SsC_SLL2eJpNrk9Wwp2YYbCLLlzHAo
*
*
* SignatureVerificationException: 签名不一致异常
* TokenExpiredException 令牌过期异常
* AlgorithmMismatchException 算法不匹配异常
* InvalidClaimException 失效的载荷异常
*/
/**
* 设置token
*/
@Test
public void maiaa() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.SECOND, 60);
String token = JWT.create()
.withHeader(new HashMap<>())//设置头信息
.withClaim("user", "安星")//设置载荷信息 可以放Array [] 数组
.withClaim("user1", 123)//设置载荷信息
.withExpiresAt(calendar.getTime())//有效过期时间
.sign(Algorithm.HMAC256("anxing"));//加密方式,"anxing"盐值
System.out.println(token);
}
/**
* 验证token
*/
@Test
public void aa(){
JWTVerifier anxing = JWT.require(Algorithm.HMAC256("anxing")).build();//创建验证对象
//验证token
DecodedJWT verify = anxing.verify("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJ1c2VyMSI6MTIzLCJleHAiOjE2MjIyMTA2NTAsInVzZXIiOiLlronmmJ8ifQ.
7cPzFyPt3udl9SsC_SLL2eJpNrk9Wwp2YYbCLLlzHAo");
System.out.println(verify.getHeader());//获取头信息
System.out.println(verify.getClaim("user").asString());//获取载荷中的user信息
System.out.println(verify.getClaim("user1"));//获取载荷中的user信息
System.out.println(verify.getToken());//获取token
System.out.println(verify.getSignature());//获取签名
System.out.println(verify.getExpiresAt());//获取过期时间
}
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mySpring</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--这个可以不导,是自己写spring用的-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.16.0</version>
</dependency>
</dependencies>
</project>
工具类献上
package com.JWT;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
/**
* jwt工具类
*/
public class JwtUtils {
private static final String SING="axning";
/**
* 生成token
* @param map 存放载荷
* @return token,传给前端
*/
public static String getToken(Map<String,String> map){
Calendar calendar=Calendar.getInstance();
calendar.add(Calendar.DATE,1); //有效期1天
JWTCreator.Builder builder = JWT.create();
map.forEach((k,v)->{
builder.withClaim(k,v);//往载荷里添加信息
});
String token=builder.withHeader(new HashMap<>())//头信息是 类型和算法,可以改
.withExpiresAt(calendar.getTime()) //过期时间
.sign(Algorithm.HMAC256(SING)); //签名
return token;
}
/**
* TODO 验证,不抛异常就是通过了
* @param token 前端带过来的
* @return DecodedJWT可获取用户信息
*/
public static DecodedJWT verify(String token){
return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
}
}