@Component public class JwtUtil { private String secret = "your-secret-key"; public String generateAccessToken(UserDetails userDetails) { return Jwts.builder() .setSubject(userDetails.getUsername()) .setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1小时有效期 .signWith(SignatureAlgorithm.HS512, secret) .compact(); } public String generateRefreshToken(UserDetails userDetails) { return Jwts.builder() .setSubject(userDetails.getUsername()) .setExpiration(new Date(System.currentTimeMillis() + 2592000000)) // 30天有效期 .signWith(SignatureAlgorithm.HS512, secret) .compact(); } }
2. 拦截器处理
在Spring Boot中,通过拦截器来检讨Access Token是否即将过期,并自动利用Refresh Token获取新的Access Token。可以创建一个JWT要求过滤器,如JwtRequestFilter。
@Component public class JwtRequestFilter extends OncePerRequestFilter { @Autowired private JwtUtil jwtUtil; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String token = request.getHeader("Authorization"); if (token != null && jwtUtil.isTokenAboutToExpire(token)) { // 利用Refresh Token获取新的Access Token // 这里须要实现与客户真个交互,例如通过WebSocket或轮询 // 假设已经获取到了新的Access Token String newAccessToken = jwtUtil.refreshAccessToken(...); // 设置新的Access Token到相应头或Session中 } chain.doFilter(request, response); } }
3. 前端处理
在前端,须要监听Token的变革,并在新的Access Token获取后更新本地存储的Token。这可以通过WebSocket、轮询或HTTP相应头来实现。
通过以上步骤,可以在Spring Boot中实现无感刷新Token,提升用户体验,并确保系统的安全性。
