使用Java延长JWT(JSON Web Token)失效时间

JWT(JSON Web Token)是一种用于认证和授权的标准,常用于API之间的交互。为了增强安全性,JWT通常设有过期时间(exp)。本文将指导你如何实现延长Token的失效时间。下面我们将通过简单的流程,以表格形式呈现步骤,并详细讲解每一步该如何操作,代码示例也将附在其中。

1. 流程概述

步骤 描述
1 生成Token
2 解码并验证Token
3 提供延长Token有效时间的接口
4 返回新的Token

2. 详细步骤与代码

步骤1:生成Token

在第一步中,我们需要生成一个JWT并设置失效时间。下面的代码示例展示了如何生成JWT。

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtUtil {
    private static final String SECRET_KEY = "your_secret_key"; // 密钥
    private static final long EXPIRATION_TIME = 60 * 60 * 1000; // 1小时有效期

    public static String generateToken(String username) {
        long nowMillis = System.currentTimeMillis(); // 当前时间
        Date now = new Date(nowMillis);
        Date expiryDate = new Date(nowMillis + EXPIRATION_TIME); // 计算失效时间

        // 生成Token
        return Jwts.builder()
            .setSubject(username) // 设置主题(用户名)
            .setIssuedAt(now) // 设置当前时间
            .setExpiration(expiryDate) // 设置失效时间
            .signWith(SignatureAlgorithm.HS512, SECRET_KEY) // 使用密钥进行签名
            .compact(); // 打包Token
    }
}

步骤2:解码并验证Token

在这个步骤中,我们需要确保接收到的Token是有效的,并获取其中的信息。

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

public class JwtUtil {
    //... 上述代码省略

    public static Claims decodeToken(String token) {
        return Jwts.parser()
            .setSigningKey(SECRET_KEY) // 使用密钥进行验证
            .parseClaimsJws(token) // 解码
            .getBody(); // 获取Claims
    }
}

步骤3:提供延长Token有效时间的接口

我们需要提供一个接口来延长Token的有效期。用户可以在Token即将过期时调用此接口。

import java.util.Date;

public class TokenService {
    private static final long EXTENSION_TIME = 30 * 60 * 1000; // 额外的30分钟

    public String extendToken(String token) {
        Claims claims = JwtUtil.decodeToken(token); // 解码Token

        // 检查当前时间是否接近过期时间
        if (claims.getExpiration().before(new Date(System.currentTimeMillis() + 10 * 60 * 1000))) { 
            long nowMillis = System.currentTimeMillis();
            Date newExpiryDate = new Date(nowMillis + EXTENSION_TIME); // 新的失效时间

            // 生成新的Token
            return Jwts.builder()
                .setSubject(claims.getSubject()) // 使用原Token的用户名
                .setIssuedAt(new Date(nowMillis))
                .setExpiration(newExpiryDate) // 设置新的失效时间
                .signWith(SignatureAlgorithm.HS512, JwtUtil.SECRET_KEY) // 使用密钥
                .compact(); // 打包新的Token
        }
        
        throw new RuntimeException("Token is not close to expiry!");
    }
}

步骤4:返回新的Token

在调用延长Token有效期的接口后,我们可以将新的Token返回给用户。通常可以在Controller中实现这一逻辑。

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class TokenController {

    @PostMapping("/extendToken")
    public String extendToken(@RequestBody String token) {
        return new TokenService().extendToken(token); // 调用服务以获取新Token
    }
}

旅行图与序列图

旅行图
journey
    title 延长JWT Token有效性
    section 用户请求
      用户向服务器请求新Token: 5: 用户
      接收旧Token: 5: 服务器
    section 服务器处理
      解码旧Token: 4: 服务器
      检查过期时间: 4: 服务器
      若在可延长时期,生成新Token: 5: 服务器
      返回新Token: 5: 服务器
序列图
sequenceDiagram
    participant User
    participant TokenController
    participant TokenService
    participant JwtUtil

    User->>TokenController: POST /extendToken
    TokenController->>TokenService: extendToken(token)
    TokenService->>JwtUtil: decodeToken(token)
    JwtUtil-->>TokenService: claims
    TokenService->>TokenService: 生成新Token
    TokenService-->>TokenController: newToken
    TokenController-->>User: 返回新Token

结尾

到这里,你已经了解了如何使用Java延长JWT Token的失效时间。通过生成Token、解码、验证并生成新的Token,你可以保持用户会话的活跃性,同时确保应用的安全性。希望这篇文章可以帮助你在学习JWT的过程中更进一步。如果你在实现过程中遇到任何问题,欢迎随时提问!