springboot同一个账号只能有一个在线,再次登录时将已经处于登录状态的所有此账号踢下线
时间: 2024-03-14 12:44:55 浏览: 45
实现同一个账号只能有一个在线的方法有很多种,其中一种比较常见的做法是使用token机制,在用户登录时生成一个token,并将其存储在服务端,同时将token返回给客户端。客户端在后续的请求中需要携带该token,服务端会验证token的有效性,从而判断用户是否已经登录。
在实现踢下线的功能时,我们可以在用户登录时将其token与账号信息存储到一个全局的Map中。当用户再次登录时,我们可以先从Map中查找是否存在该账号的token,如果存在,则说明该账号已经登录,我们可以将其对应的token删除并让其下线,然后再将新的token存储到Map中,以保证同一个账号只能有一个在线。具体实现可以参考以下代码:
```java
@Component
public class UserLoginInterceptor extends HandlerInterceptorAdapter {
// 存储token和账号的映射关系
private static final Map<String, String> TOKEN_MAP = new ConcurrentHashMap<>();
@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);
// TODO: 发送下线通知
}
// 将新的token存储到Map中
TOKEN_MAP.put(token, username);
}
return true;
}
}
```
在上述代码中,我们使用了一个ConcurrentHashMap来存储token和账号的映射关系。在用户请求到达时,我们首先从请求头中获取token,然后在Map中查找该token对应的账号信息。如果存在该账号信息,则说明该账号已经登录,我们可以将其踢下线。最后,我们将新的token存储到Map中,以保证同一个账号只能有一个在线。需要注意的是,我们在删除旧的token之前可以发送一个下线通知,以便让用户知道自己被踢下线了。