1、JWT 是什么?
JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名。
简单来说,就是通过一定规范来生成 token,然后可以通过解密算法逆向解密 token,这样就可以获取用户信息。
优点:
1)生产的 token 可以包含基本信息,比如 id、用户昵称、头像等信息,避免再次查库
2)存储在客户端,不占用服务端的内存资源
缺点:
token 是经过 base64 编码,所以可以解码,因此 token 加密前的对象不应该包含敏感信息,如用户权限,密码等
2、JWT 格式组成:头部、负载、签名
header+payload+signature
头部:主要是描述签名算法
负载:主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西,如 iss 签发者,exp 过期时间,sub 面向的用户
签名:主要是把前面两部分进行加密,防止别人拿到 token 进行 base 解密后篡改 token
3、关于jwt客户端存储
可以存储在 Cookie,localStorage 和 sessionStorage 里面
4、引入相关依赖并开发 JWT 工具类
1)引入依赖
<!-- JWT相关 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version> </dependency>
2)开发生产 token 方法
3)开发检验 token 方法
package com.haitaiinc.clinicpathservice.utils; import com.haitaiinc.clinicpathservice.entity.UserInfo; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.util.StringUtils; import java.util.Date; public class JwtUtils { public static final String SUBJECT = "admin"; /** * 过期时间,毫秒,一周 */ public static final long EXPIRE = 1000 * 60 * 60 * 24 * 7; /** * 秘钥 */ public static final String APPSECRET = "haitaiinc"; /** * 生成jwt * * @param userInfo * @return */ public static String geneJsonWebToken(UserInfo userInfo) { if (userInfo == null || StringUtils.isEmpty(userInfo.getUserId()) || StringUtils.isEmpty(userInfo.getUserName())) { return null; } String token = Jwts.builder().setSubject(SUBJECT) .claim("id", userInfo.getUserId()) .claim("name", userInfo.getUserName()) .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; } }
4)测试
package com.haitaiinc.clinicpathservice; import com.haitaiinc.clinicpathservice.entity.UserInfo; import com.haitaiinc.clinicpathservice.utils.JwtUtils; import io.jsonwebtoken.Claims; import org.junit.jupiter.api.Test; public class CommonTest { @Test public void testGeneJwt() { UserInfo user = new UserInfo(); user.setUserId("admin"); user.setUserName("管理员"); String token = JwtUtils.geneJsonWebToken(user); System.out.println(token); } @Test public void testCheck() { String token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlkIjoiYWRtaW4iLCJuYW1lIjoi566h55CG5ZGYIiwiaWF0IjoxNTc3NTU3MDU1LCJleHAiOjE1NzgxNjE4NTV9.VrrKtCTnxVN76JhpyIusCGq9Wj89wLor0OqIJ6s0zXo"; Claims claims = JwtUtils.checkJWT(token); if (claims != null) { String id = (String) claims.get("id"); String name = (String) claims.get("name"); System.out.println(id); System.out.println(name); } else { System.out.println("非法token"); } } }
原文地址:https://www.cnblogs.com/jwen1994/p/12113888.html
时间: 2024-11-07 18:49:58