Springboot+vue+redis实现一个账户只能在一处登录
时间: 2023-12-21 15:07:43 浏览: 191
实现一个账户只能在一处登录,可以使用token加redis实现。具体实现步骤如下:
1. 用户登录时,生成一个token,并将其存储到redis中。同时将token返回给客户端。
```java
@Component
public class UserLoginInterceptor extends HandlerInterceptorAdapter {
// 存储token和账号的映射关系
private static final Map<String, String> TOKEN_MAP = new ConcurrentHashMap<>();
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String token = request.getHeader("token");
if (StringUtils.isNotBlank(token)) {
String username = TOKEN_MAP.get(token);
if (StringUtils.isNotBlank(username)) {
// 说明该账号已经登录,将其踢下线
TOKEN_MAP.remove(token);
// 删除redis中的token
redisTemplate.delete(username);
// TODO: 发送下线通知
}
// 将新的token存储到Map和redis中
TOKEN_MAP.put(token, username);
redisTemplate.opsForValue().set(username, token, 30, TimeUnit.MINUTES);
}
return true;
}
}
```
2. 在用户请求时,验证token的有效性。从redis中查找该token是否存在,如果存在则说明用户已经在其他地方登录了,需要将用户踢下线。
```java
@Component
public class TokenVerifyInterceptor extends HandlerInterceptorAdapter {
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String token = request.getHeader("token");
if (StringUtils.isNotBlank(token)) {
String username = getTokenUsername(token);
if (StringUtils.isNotBlank(username)) {
// 从redis中获取该账号的token
String redisToken = redisTemplate.opsForValue().get(username);
if (StringUtils.isNotBlank(redisToken) && !redisToken.equals(token)) {
// 说明该账号已经在其他地方登录了,将其踢下线
// TODO: 发送下线通知
return false;
}
}
}
return true;
}
/**
* 从token中获取username
*/
private String getTokenUsername(String token) {
// TODO: 解析token获取username
return null;
}
}
```
在上述代码中,我们使用了RedisTemplate来操作redis。在用户登录时,我们将token存储到redis中,并设置过期时间为30分钟。在用户请求时,我们从redis中查找该token对应的账号信息,如果存在且与当前账号信息不一致,则说明用户已经在其他地方登录了,需要将用户踢下线。
需要注意的是,这里的token的生成和解析需要根据具体的业务逻辑进行实现。可以使用JWT等方式来实现。同时,对于踢下线的操作,还需要考虑如何发送下线通知等问题。
阅读全文