Java中JWT续期的那些事儿:实战技巧与经验分享

一、JWT简介
JWT(JSON Web Token)是一种用于在网络应用之间安全地传输信息的简洁、自包含的方式。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。JWT广泛应用于身份验证、会话管理等领域,因其无需服务器存储用户信息,且传输速度快,逐渐成为Web应用开发的热门技术。
二、JWT续期原理
JWT本身不具备续期功能,但我们可以通过以下方式实现JWT的续期:
1. 设置token有效期:在生成JWT时,可以设置一个较长的有效期,例如1小时。当用户登录成功后,服务器返回一个具有较长时间效期的token。
2. 前端定时刷新token:前端在收到token后,可以设置一个定时器,定时向服务器发送请求,请求服务器生成一个新的token,并将新的token存储在本地。当旧token即将过期时,使用新token替换旧token。
3. 后端实现续期:后端在验证token时,可以检测token是否即将过期,如果即将过期,则返回一个新的token给客户端。
三、JWT续期实战
以下是一个简单的JWT续期实现示例:
1. 生成JWT
```java
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtil {
private static final String SECRET_KEY = "mysecretkey";
public static String generateToken() {
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
long expMillis = nowMillis + 3600000; // 1小时后过期
Date exp = new Date(expMillis);
return Jwts.builder()
.setIssuedAt(now)
.setExpiration(exp)
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
}
```
2. 前端定时刷新token
```javascript
let token = JwtUtil.generateToken();
// 设置定时器,每30分钟刷新一次token
setInterval(() => {
// 向服务器发送请求,获取新的token
fetch('/api/refreshToken', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
}
})
.then(response => response.json())
.then(data => {
token = data.token; // 将新的token存储在本地
});
}, 1800000);
```
3. 后端实现续期
```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TokenController {
private static final String SECRET_KEY = "mysecretkey";
@PostMapping("/api/refreshToken")
public String refreshToken() {
// 验证token是否即将过期
Claims claims = Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody();
if (claims.getExpiration().getTime() - System.currentTimeMillis() < 300000) { // 如果token即将过期
// 生成新的token
String newToken = Jwts.builder()
.setSubject(claims.getSubject())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
return newToken;
} else {
return "Token is not expired";
}
}
}
```
四、总结
本文介绍了JWT续期的原理和实战技巧,通过设置token有效期、前端定时刷新token和后端实现续期三种方式,实现了JWT的续期功能。在实际开发中,可以根据具体需求选择合适的方式,以确保系统的安全性和稳定性。






