JWT工具类实战:在Spring Boot中实现Token生成与解析

JWT工具类实战:在Spring Boot中实现Token生成与解析

_

在当今的前后端分离架构中,JWT(JSON Web Token)已成为身份认证的主流方案。今天,我们将通过一个简洁的JWT工具类,深入理解Token的生成与解析原理。

一、JWT简介

JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输JSON格式的信息。一个JWT通常由三部分组成:

- Header(头部)

- Payload(负载)

- Signature(签名)

二、工具类源码解析

让我们来看一个基于java-jwt库实现的工具类:

import com.auth0.jwt.JWT;

import com.auth0.jwt.algorithms.Algorithm;

import java.util.Date;

import java.util.Map;

public class JwtUtil {

    // 签名密钥,实际项目中应配置在配置文件或环境变量中

    private static final String KEY = "test";

    /**

     * 生成JWT Token

     * @param claims 业务数据(用户信息等)

     * @return 签名的JWT字符串

     */

    public static String genToken(Map<String, Object> claims) {

        return JWT.create()

                .withClaim("claims", claims)      // 设置自定义数据

                .withExpiresAt(new Date(System.currentTimeMillis() + 1000  60  60 * 12)) // 12小时过期

                .sign(Algorithm.HMAC256(KEY));    // HMAC256算法签名

    }


    /**

     * 解析验证JWT Token

     * @param token JWT字符串

     * @return 业务数据

     */

    public static Map<String, Object> parseToken(String token) {

        return JWT.require(Algorithm.HMAC256(KEY))

                .build()

                .verify(token)                    // 验证签名和过期时间

                .getClaim("claims")                // 获取claims字段

                .asMap();                          // 转换为Map对象

    }

}

三、核心功能详解

1. Token生成(genToken方法)

关键点说明:

- withClaim("claims", claims):将业务数据存储在JWT的payload中

- withExpiresAt():设置过期时间,这里是12小时

- sign(Algorithm.HMAC256(KEY)):使用HMAC256算法和密钥进行签名

2. Token解析(parseToken方法)

工作流程:

1. require(Algorithm.HMAC256(KEY)):指定验证算法和密钥

2. verify(token):验证签名有效性和是否过期

3. getClaim("claims"):提取存储的业务数据

4. asMap():将数据转换为Map格式

四、使用示例

生成Token

// 创建用户信息

Map<String, Object> claims = new HashMap<>();

claims.put("userId", 1001);

claims.put("username", "zhangsan");

claims.put("role", "admin");

// 生成Token

String token = JwtUtil.genToken(claims);

System.out.println("生成的Token: " + token);

解析Token

try {

    // 解析Token

    Map<String, Object> userInfo = JwtUtil.parseToken(token);

    System.out.println("用户ID: " + userInfo.get("userId"));

    System.out.println("用户名: " + userInfo.get("username"));

} catch (Exception e) {

    System.out.println("Token无效或已过期: " + e.getMessage());

}

五、最佳实践建议

1. 密钥管理:不要将密钥硬编码在代码中,建议使用配置文件或环境变量

2. 过期时间设置:根据业务需求设置合理的过期时间,一般建议2-24小时

3. 异常处理:解析Token时需捕JWTVerificationException异常

4. HTTPS传输:生产环境务必使用HTTPS防止Token被截获

六、依赖配置

pom.xml中添加依赖:

<dependency>

    <groupId>com.auth0</groupId>

    <artifactId>java-jwt</artifactId>

    <version>4.4.0</version>

</dependency>

七、总结

这个JWT工具类虽然代码量少,但涵盖了JWT的核心功能:生成带业务数据的Token,并能够验证解析。在实际项目中,我们可以基于此类构建完整的认证拦截器,实现无状态的身份认证。

JWT的无状态特性使其非常适合微服务和分布式系统,但也需要注意Token注销和续期等问题。希望这个工具类能帮助你在项目中快速集成JWT认证功能!

Debian系统安装 2026-03-09