Spring Boot项目中JWT过期(ExpiredJwtException)问题求解
解决JWT过期异常(io.jsonwebtoken.ExpiredJwtException)的方案
1. 重新获取有效JWT令牌
- 若项目实现了刷新令牌(Refresh Token)机制,前端捕获到过期异常后,调用刷新接口用有效的refresh token换取新的access token,无需用户重新登录。
- 若无刷新机制,引导用户重新登录,后端生成新的JWT令牌,示例代码(基于JJWT框架):
String generateNewToken(String username, String secretKey) { return Jwts.builder() .setSubject(username) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 设置1小时有效期 .signWith(SignatureAlgorithm.HS256, secretKey.getBytes()) .compact(); }
2. 优化JWT过期策略
- 根据业务场景调整access token的过期时长:敏感操作(如支付)设15-30分钟,普通操作设1-2小时,平衡安全性和用户体验。
- 推荐搭配刷新令牌机制:refresh token有效期设为7-14天,存储在HttpOnly Cookie中,用于在access token过期时静默获取新令牌。
3. 配置允许的时钟偏差
如果是服务器与客户端时间不同步导致的误判,可以在JWT验证时设置允许的时钟偏差,示例代码:
Claims validateToken(String token, String secretKey) { return Jwts.parser() .setSigningKey(secretKey.getBytes()) .setAllowedClockSkewSeconds(300) // 允许5分钟的时间偏差 .parseClaimsJws(token) .getBody(); }
注意:偏差值不宜过大,避免引入安全风险。
4. 检查系统时间一致性
确认后端服务器、前端客户端的系统时间是否同步到标准UTC时间,避免因时区偏差或本地时间错误导致的令牌过期判断异常。
内容的提问来源于stack exchange,提问作者Srilatha Nandamuri
相关产品推荐
相关产品推荐

