Java登录Token过期处理
1. 流程概述
为了保证系统的安全性和用户信息的保护,很多Web应用都会采用Token认证方式来实现用户登录。Token是一种用于身份验证的令牌,通常由服务器生成并返回给客户端,客户端在后续的请求中携带该Token来进行身份校验。为了保证安全性,Token通常具有一定的过期时间,一旦Token过期,客户端需要重新获取新的Token来继续访问。
下面将介绍一种常见的实现Java登录Token过期处理的方法,帮助刚入行的小白快速掌握该技术。
2. 实现步骤
步骤 | 描述 |
---|---|
1 | 用户通过用户名和密码提交登录请求 |
2 | 服务器验证用户名和密码的正确性 |
3 | 服务器生成Token,并设置过期时间 |
4 | 服务器将Token返回给客户端 |
5 | 客户端在后续请求中携带Token |
6 | 服务器校验Token的有效性和过期时间 |
7 | 若Token有效且未过期,则继续处理请求 |
8 | 若Token无效或已过期,则要求客户端重新登录 |
3. 具体实现
3.1. 登录请求处理
首先,我们需要处理用户的登录请求。以下是一个简化的示例代码,用于验证用户名和密码的正确性:
@PostMapping("/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password) {
// TODO: 根据用户名和密码验证用户的正确性,此处省略具体实现
boolean isValidUser = validateUser(username, password);
if (isValidUser) {
// 生成并返回Token
String token = generateToken(username);
return token;
} else {
return "登录失败,用户名或密码错误";
}
}
3.2. Token生成与过期时间设置
当用户登录成功后,我们需要生成Token并设置过期时间。以下是一个示例代码:
private String generateToken(String username) {
// 生成Token
String token = UUID.randomUUID().toString();
// 设置Token的过期时间
long expireTime = System.currentTimeMillis() + TOKEN_EXPIRATION_TIME;
redis.set(token, username);
redis.expire(token, TOKEN_EXPIRATION_TIME);
return token;
}
在上述代码中,我们使用UUID生成一个唯一的Token,并将Token和用户名存储到缓存中(这里假设使用Redis作为缓存),然后设置Token的过期时间为当前时间加上一个固定的时间间隔(例如30分钟)。这样,Token就具有了一定的有效期。
3.3. 请求处理与Token校验
当客户端在后续的请求中携带Token时,我们需要对Token进行校验,判断其是否有效以及是否过期。以下是一个示例代码:
@RequestMapping("/api")
public String handleRequest(@RequestParam("token") String token) {
// 校验Token的有效性和过期时间
boolean isValidToken = validateToken(token);
if (isValidToken) {
// Token有效,继续处理请求
return "处理请求";
} else {
// Token无效或已过期,要求客户端重新登录
return "Token无效或已过期,请重新登录";
}
}
private boolean validateToken(String token) {
// 判断Token是否存在
if (!redis.exists(token)) {
return false;
}
// 判断Token是否过期
long expireTime = redis.getExpire(token);
if (expireTime <= 0) {
return false;
}
// 更新Token的过期时间
redis.expire(token, TOKEN_EXPIRATION_TIME);
return true;
}
在上述代码中,我们首先判断Token是否存在,如果Token不存在,则说明无效;接着判断Token是否过期,如果过期则说明无效;最后,更新Token的过期时间,延长Token的生命周期。
3.4. 客户端重新登录
当Token无效或已过期时,我们需要要求客户端重新登录。这可以通过返回一个特定的状态码或错误信息来实现。以下是一个示例代码:
@GetMapping