登录校验JWT令牌
原创 于 2024-10-15 18:35:08 发布 · 粉丝可见 · 698 阅读 · 3 · 4 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/142959721
JWT(JSONWeb Tokens)官网: JSON Web Tokens - jwt.io
一种开放标准(RFC 7519),它定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。
由于数字签名的存在,这些信息是可靠的。
每个JWT令牌由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。
JWT可以被用来在用户和服务器之间安全地传递信息,常用于身份验证和信息交换。
JWT通常包含以下信息:
头部(Header) :通常包含令牌的类型(即JWT)和所使用的签名算法,比如HS256或RS256。
载荷(Payload) :包含所要传递的信息。对于登录场景,可能包含用户ID、用户名、角色、令牌的过期时间等。
签名(Signature) :使用头部和载荷的信息,加上一个密钥,通过指定的算法生成签名。这个签名用于验证JWT的完整性和验证发送者的身份。
JWT应用
引入依赖
1 2 3 4 5 6
| <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency>
|
刨析创建Jwt过程,解释代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Test public void testCreateJwt() { Map<String, Object> claims = new HashMap<>();
claims.put("id", 15); claims.put("username", "angindem"); claims.put("password", "123456");
String jwt = Jwts.builder() .signWith(SignatureAlgorithm.HS256, "angindem") .setClaims(claims) .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) .compact();
System.out.println(jwt); }
|
最后获取打印的令牌:
1
| eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImlkIjoxNSwiZXhwIjoxNzI4OTg4OTU0LCJ1c2VybmFtZSI6ImFuZ2luZGVtIn0.330s6ykeitx58fC9n-5pPKAhH3555Ge-DUvNRCR-fe0
|
通过官网解析可以得到相应的对象信息

刨析 解析Jwt令牌过程,解释代码如下
1 2 3 4 5 6 7 8 9 10 11 12
| @Test public void testParseJwt(){
String jwt = "eyJhbGciOiJIUzI1NiJ9.eyJwYXNzd29yZCI6IjEyMzQ1NiIsImlkIjoxNSwiZXhwIjoxNzI4OTg4OTU0LCJ1c2VybmFtZSI6ImFuZ2luZGVtIn0.330s6ykeitx58fC9n-5pPKAhH3555Ge-DUvNRCR-fe0";
Claims claims = Jwts.parser() .setSigningKey("angindem") .parseClaimsJws(jwt) .getBody();
System.out.println(claims); }
|
最后解析结果:

Jwt令牌工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date; import java.util.Map;
public class JwtUtils {
private static String signKey = "Angindem"; private static Long expire = 43200000L;
public static String getJwt(Map<String,Object> claims){ String jwt = Jwts.builder() .signWith(SignatureAlgorithm.HS256, signKey) .setClaims(claims) .setExpiration(new Date(System.currentTimeMillis() + expire)) .compact(); return jwt; }
public static Claims parseJwt(String jwt){ Claims claims = Jwts.parser() .setSigningKey(signKey) .parseClaimsJws(jwt) .getBody(); return claims; } }
|