springsecurity自动续token有效期
时间: 2025-02-01 12:39:09 浏览: 49
### Spring Security 中实现 Token 的自动续期
在现代Web应用程序中,Token机制被广泛用于用户的身份验证和授权管理。为了提升用户体验并减少频繁登录带来的不便,在Spring Security框架下可以采用多种方式来实现在一定条件下的Token自动续期功能。
#### 双Token方案概述
一种常见的做法是引入访问令牌(Access Token)与刷新令牌(Refresh Token),其中前者负责短期会话期间内的请求合法性校验;后者则用来安全地换取新的访问令牌而不必每次都让用户输入凭证信息[^2]。
当客户端发起HTTP请求时携带有效的Access Token作为认证依据。如果该Token即将到期,则可以在响应头中返回一个新的Token给前端应用以便无缝切换至最新版本的Token。这种方式既保持了安全性又提高了便利度。
对于具体的编码实践而言:
- **创建自定义过滤器**
通过继承`OncePerRequestFilter`类来自定义一个名为JwtAuthTokenFilter的过滤器组件,并将其注册到全局的安全链路当中去处理每一个进入系统的API调用事件。
```java
public class JwtAuthTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
String jwt = getJwtFromRequest(request);
if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) {
Claims claims = tokenProvider.getClaimsFromToken(jwt);
// 判断是否接近过期时间
long expirationTimeMillis = claims.getExpiration().getTime() - System.currentTimeMillis();
if(expirationTimeMillis < THRESHOLD_MILLIS){
// 如果剩余有效期小于设定阈值,则生成新token
String newAccessToken = createNewAccessToken(claims);
((HttpServletResponse)response).addHeader("Authorization", "Bearer "+newAccessToken);
}
UserDetails userDetails = userDetailsService.loadUserByUsername((String) claims.getSubject());
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (Exception e) {
logger.error("Cannot set user authentication: {}", e.getMessage());
}
filterChain.doFilter(request, response);
}
}
```
上述代码片段展示了如何在一个典型的JWT过滤器内部判断当前使用的Token是否快要失效,并据此决定是否要向客户端发送更新后的Token副本[^1]。
此外还可以考虑利用Redis存储Refresh Tokens以及它们对应的有效期限等元数据,从而进一步增强整个体系结构的安全性和灵活性[^4]。
阅读全文
相关推荐


















