1. 在 TokenManager
中添加 getTokenExpireTime()
方法
这种方法的好处是,既不会修改现有的 TokenManager
逻辑,也能为测试提供获取 token 过期时间的方法。
实现思路:
你可以在 TokenManager
中添加一个方法,来返回当前 token 的过期时间。这个方法应该会根据 token 的创建时间和过期时间(通常是 iat
和 exp
)来计算 token 是否过期。
签发时间(Issued At Time,通常缩写为 iat
)是 JWT(JSON Web Token)中的一个标准声明(claim),用于表示这个 JWT 令牌是什么时候被创建(签发)的。它是一个时间戳,通常以 Unix 时间(即从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的秒数)表示。
测试代码示例:
在测试中,你可以使用 getTokenExpireTime()
方法来验证 token 是否在预期的时间内过期。
public class TokenManager {
private static final long EXPIRATION_TIME = 3600 * 1000; // 过期时间为 1 小时
// 生成 JWT token
public String generateToken(String username) {
Date now = new Date(); // 获取当前时间
Date expiryDate = new Date(now.getTime() + EXPIRATION_TIME); // 计算过期时间
// 创建 JWT token 并设置过期时间
return Jwts.builder()
.setSubject(username) // 设置主题为用户名
.setIssuedAt(now) // 设置签发时间
.setExpiration(expiryDate) // 设置过期时间
.signWith(SignatureAlgorithm.HS512, "secret-key") // 使用 HS512 算法和密钥签名
.compact(); // 生成 token
}
// 获取 token 过期时间
public Date getTokenExpireTime(String token) {
try {
Claims claims = Jwts.parser()
.setSigningKey("secret-key") // 设置签名密钥
.parseClaimsJws(token) // 解析 token
.getBody(); // 获取有效载荷
return claims.getExpiration(); // 返回过期时间
} catch (Exception e) {
return null; // 如果 token 无效或解析失败,返回 null
}
}
}
优点:
- 通过
getTokenExpireTime()
方法方便地获得 token 的过期时间,并且不需要修改TokenManager
的核心逻辑。 - 测试变得更加灵活,可以针对过期时间进行精确验证。
缺点:
- 这种方法需要依赖
getTokenExpireTime()
方法返回的时间,这可能会引入额外的复杂性,尤其是在不同的过期策略下(如 JWT)。
2. 修改 TokenManager
实现,支持较短的过期时间
如果你需要测试 token 是否过期,并且不想额外引入 getTokenExpireTime()
方法,你可以考虑修改 TokenManager
来支持较短的过期时间。
实现思路:
为了让 token 更快过期,你可以在 TokenManager
中通过设置较短的过期时间(例如,几秒钟)来加速过期过程。这样你可以直接在测试中验证 token 是否会在短时间内过期。
@Test
public void testTokenExpiration() {
TokenManager tokenManager = new TokenManager();
String token = tokenManager.generateToken("admin");
Date expireTime = tokenManager.getTokenExpireTime(token);
Date now = new Date();
assertNotNull(expireTime);
assertTrue(expireTime.after(now)); // 过期时间应该在当前时间之后
}
测试代码示例:
@Test
public void testTokenExpiration() {
TokenManager tokenManager = new TokenManager();
String token = tokenManager.generateToken("admin");
Date expireTime = tokenManager.getTokenExpireTime(token);
Date now = new Date();
assertNotNull(expireTime);
assertTrue(expireTime.after(now)); // 过期时间应该在当前时间之后
}
优点:
- 不需要额外的
getTokenExpireTime()
方法,直接通过设置较短的过期时间,快速验证过期的情况。 - 这种方法直接测试 token 的生命周期,避免了额外的计算和解析步骤。
缺点:
- 需要修改
TokenManager
中的过期时间设置,这可能会影响整个系统的配置和其他功能。 - 修改过期时间可能会使得其他功能或测试也受到影响,因此在测试后应恢复正常的过期时间。
总结
- 添加
getTokenExpireTime()
方法:这种方法不修改现有的 token 逻辑,通过读取 token 的过期时间来进行验证,适用于不想改变现有逻辑的情况。 - 修改
TokenManager
的实现:这种方法直接通过调整过期时间,测试 token 是否会在短时间内过期,适用于需要快速验证 token 过期的情况。