在Java编程中,如何设计一个登录系统,使得用户登录后的token默认有效期为30分钟?当用户频繁访问接口时,如何实现点击接口后token的失效时间延长至30分钟而不是立即过期?
时间: 2024-11-03 16:18:02 浏览: 5
在Java中设计一个登录系统的流程可以分为以下几个步骤:
1. 用户登录:创建一个`UserLogin`类,其中包含用户名、密码以及生成的临时Token。使用`java.time.Instant`来记录登录时间,并设置一个默认的Token有效时间为30分钟(即1800秒)。
```java
import java.util.Date;
import java.time.Instant;
public class UserLogin {
private String username;
private String password;
private String token;
private Instant loginTime;
public UserLogin(String username, String password) {
this.username = username;
this.password = password;
this.loginTime = Instant.now();
// 设置Token默认有效期为30分钟
setTokenValidity(1800);
}
private void setTokenValidity(int seconds) {
this.token = "..." + System.currentTimeMillis() + ":" + seconds;
}
// 其他方法...
}
```
2. 检验Token:在需要验证权限的每个接口上,首先检查传入的Token是否有效。计算当前时间和登录时间差,如果超过30分钟,则认为Token已过期。
```java
public boolean validateToken(UserLogin user) {
long expiration = user.getLoginTime().plusSeconds(user.getTokenValidity()).toEpochMilli();
if (System.currentTimeMillis() > expiration) {
return false; // Token已过期
} else {
// 更新最后访问时间并返回true
user.setLastAccessTime(Instant.now());
return true;
}
}
```
3. 过期时间调整:当用户频繁访问接口时,在`validateToken`方法内部,如果Token未过期,可以根据当前时间与上次访问时间之差来判断是否需要延长Token的有效期。例如,如果两次请求间隔小于30分钟,就将Token的有效期更新到新的30分钟。
```java
private void maybeExtendValidity(UserLogin user) {
if (!validateToken(user)) { return; }
long lastAccess = user.getLastAccessTime().toEpochMilli();
if (lastAccess - user.getLoginTime().toEpochMilli() < 1800 * 1000) { // 如果在30分钟内
user.setTokenValidity(1800); // 延长Token有效期
}
}
```
阅读全文