🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
一、引入依赖 ### ![](https://img.kancloud.cn/e2/3f/e23f53bfba3749ed8b65a212ba160510_1626x959.png) ### ~~~ <!-- JWT相关 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version> </dependency> ~~~ ### 二、创建生成和校验jwt的工具类 ### ![](https://img.kancloud.cn/26/4a/264a97bca3d0b166131b9c614eddcff4_1521x974.png) ### 具体代码如下: ### ~~~ package net.xdclass.xdvideo.utils; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import net.xdclass.xdvideo.domain.User; import java.util.Date; /* * jwt工具类 * */ public class JwtUtils { //主题 表示该JWT所面向的用户或实体 public static final String SUBJECT = "xdclass"; //过期时间 毫秒为单位 这里设置了一周的过期时间 public static final long EXPIRE = 1000*60*60*24*7; //秘钥 public static final String APPSECRET = "xd666"; /* * 生成jwt * */ public static String geneJsonWebToken(User user){ if(user == null || user.getId() == null || user.getName() == null || user.getHeadImg() == null){ return null; } //String token = Jwts.builder(): 创建一个JWT构建器对象 //setSubject(SUBJECT): 设置JWT的主题字段为预定义的 SUBJECT,即"xdclass" //claim("id",user.getId()): 向JWT添加一个自定义声明(claim),键为"id",值为用户的ID 其他也类似 //setIssuedAt(new Date()): 设置JWT的签发时间为当前时间 //setExpiration(new Date(System.currentTimeMillis()+EXPIRE)): 设置JWT的过期时间为当前时间加上预定义的过期时间 EXPIRE。 //signWith(SignatureAlgorithm.HS256,APPSECRET): 使用HS256算法以及预定义的密钥 APPSECRET 对JWT进行签名 //compact(): 构建并返回JWT字符串表示形式 String token = Jwts.builder().setSubject(SUBJECT) .claim("id",user.getId()) .claim("name",user.getName()) .claim("img",user.getHeadImg()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis()+EXPIRE)) .signWith(SignatureAlgorithm.HS256,APPSECRET) .compact(); return token; } /* * 校验token * @param token * @return * */ public static Claims checkJWT(String token){ try{ final Claims claims = Jwts.parser().setSigningKey(APPSECRET) .parseClaimsJws(token) .getBody(); return claims; }catch(Exception e){} return null; } } ~~~ ### 编写测试用例来进行校验 ### ![](https://img.kancloud.cn/6e/2b/6e2b1098b38a98b318b3e87319683dbd_1494x984.png) ### 具体测试用例代码如下所示: ### ~~~ package net.xdclass.xdvideo; import io.jsonwebtoken.Claims; import net.xdclass.xdvideo.domain.User; import net.xdclass.xdvideo.utils.JwtUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.Date; @RunWith(SpringRunner.class) @SpringBootTest public class JwtTestController { @Test public void testGeneJwt(){ User user = new User(); user.setId(999); user.setHeadImg("www.xdclass.net"); user.setName("xd"); String token = JwtUtils.geneJsonWebToken(user); System.out.println(token); } @Test public void testCheck(){ String token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ4ZGNsYXNzIiwiaWQiOjk5OSwibmFtZSI6InhkIiwiaW1nIjoid3d3LnhkY2xhc3MubmV0IiwiaWF0IjoxNzExMTU3NDc2LCJleHAiOjE3MTE3NjIyNzZ9.r6n8MgcgjmeYfpwR_JKbBoNA2fSM4dNzihQY2s6v1ZQ"; Claims claims = JwtUtils.checkJWT(token); if(claims != null){ String name = (String) claims.get("name"); String img = (String) claims.get("img"); int id = (Integer) claims.get("id"); System.out.println(name + img + String.valueOf(id)); }else{ System.out.println("非法token"); } } } ~~~