增加 websocket 单设备登录

This commit is contained in:
wanggeng 2022-08-08 16:41:55 +08:00
parent 40dda4e47a
commit 40d103963b
7 changed files with 62 additions and 20 deletions

View File

@ -59,7 +59,7 @@ public interface IWebSocketUserSessionManager {
* @param clientName 客户端名称
* @return
*/
WebSocketSession getOnlineUser(String userId, String clientName);
List<WebSocketSession> listOnlineUser(String userId, String clientName);
/**
* 在线会话列表

View File

@ -85,4 +85,23 @@ public class WebSocketSession implements Serializable {
public void setUpdateTime(Long updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"sessionId\":\"")
.append(sessionId).append('\"');
sb.append(",\"userId\":\"")
.append(userId).append('\"');
sb.append(",\"clientName\":\"")
.append(clientName).append('\"');
sb.append(",\"channelId\":\"")
.append(channelId).append('\"');
sb.append(",\"channel\":")
.append(channel);
sb.append(",\"updateTime\":")
.append(updateTime);
sb.append('}');
return sb.toString();
}
}

View File

@ -30,6 +30,7 @@ public class WebSocketClientAppController {
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@GetMapping("login/{clientName}")
public SuccessResultData<String> login(@RequestHeader("token") String token, @PathVariable("clientName") String clientName) {
System.out.println(">>>> token" + token);
String sessionId = webSocketClientService.login(token, clientName);
return new SuccessResultData<>(sessionId);
}

View File

@ -36,8 +36,11 @@ public class WebSocketClientServiceImpl extends DefaultBaseService implements IW
* @param clientName 客户端名称
* @return
*/
private String initSession(String userId, String clientName) {
private synchronized String initSession(String userId, String clientName) {
String sessionId = UUIDUtil.getUUID();
// 通知下线
WebSocketChannelManager.getInstance().logout(userId, clientName);
System.out.println(">>>>>>>> sessionId: " + sessionId);
WebSocketChannelManager.getInstance().init(userId, sessionId, clientName);
return sessionId;
}

View File

@ -13,6 +13,7 @@ package ink.wgink.module.instantmessage.websocket.enums;
public enum MessageTypeEnum {
REGISTER(1000, "注册消息body 为 RegisterBody 的 JSON 字符串"),
LOGOUT(1001, "注销"),
MESSAGE(2001, "文本消息"),
MESSAGE_HREF(2002, "链接消息"),

View File

@ -27,19 +27,14 @@ public class DefaultWebSocketUserSessionManager implements IWebSocketUserSession
@Override
public void init(String userId, String sessionId, String clientName) {
WebSocketSession onlineUser = getOnlineUser(userId, clientName);
if (onlineUser == null) {
onlineUser = new WebSocketSession();
onlineUser.setUserId(userId);
onlineUser.setClientName(clientName);
// 更新到session队列中
List<WebSocketSession> webSocketSessions = listOnlineUser(userId);
webSocketSessions.add(onlineUser);
webSocketUserMap.put(userId, webSocketSessions);
}
// 更新最后时间
WebSocketSession onlineUser = new WebSocketSession();
onlineUser.setUserId(userId);
onlineUser.setClientName(clientName);
onlineUser.setSessionId(sessionId);
onlineUser.setUpdateTime(System.currentTimeMillis());
List<WebSocketSession> webSocketSessions = listOnlineUser(userId);
webSocketSessions.add(onlineUser);
webSocketUserMap.put(userId, webSocketSessions);
}
@Override
@ -85,20 +80,21 @@ public class DefaultWebSocketUserSessionManager implements IWebSocketUserSession
}
@Override
public WebSocketSession getOnlineUser(String userId, String clientName) {
public List<WebSocketSession> listOnlineUser(String userId, String clientName) {
if (StringUtils.isBlank(userId) || StringUtils.isBlank(clientName)) {
return null;
return new ArrayList<>();
}
List<WebSocketSession> webSocketSessions = listOnlineUser(userId);
if (webSocketSessions.isEmpty()) {
return null;
return webSocketSessions;
}
List<WebSocketSession> clientNameWebSocketSessions = new ArrayList<>();
for (WebSocketSession webSocketSession : webSocketSessions) {
if (StringUtils.equals(clientName, webSocketSession.getClientName())) {
return webSocketSession;
clientNameWebSocketSessions.add(webSocketSession);
}
}
return null;
return clientNameWebSocketSessions;
}
@Override

View File

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import ink.wgink.exceptions.websocket.SessionException;
import ink.wgink.interfaces.manager.IWebSocketChannelManager;
import ink.wgink.interfaces.manager.IWebSocketUserSessionManager;
import ink.wgink.module.instantmessage.websocket.enums.MessageTypeEnum;
import ink.wgink.module.instantmessage.websocket.pojo.WebSocketClientMessage;
import ink.wgink.pojo.session.WebSocketSession;
import ink.wgink.properties.websocket.WebSocketProperties;
@ -49,6 +50,27 @@ public class WebSocketChannelManager implements IWebSocketChannelManager {
webSocketUserSessionManager.init(userId, sessionId, clientName);
}
/**
* 登出
*
* @param userId
* @param clientName
*/
public void logout(String userId, String clientName) {
List<WebSocketSession> webSocketSessions = webSocketUserSessionManager.listOnlineUser(userId, clientName);
if (webSocketSessions.isEmpty()) {
return;
}
WebSocketClientMessage webSocketClientMessage = new WebSocketClientMessage();
webSocketClientMessage.setSystem(true);
webSocketClientMessage.setType(MessageTypeEnum.LOGOUT.getValue());
webSocketClientMessage.setFrom(WebSocketChannelManager.FORM_SYSTEM);
webSocketClientMessage.setTo(userId);
webSocketSessions.forEach(webSocketSession -> {
sendText(webSocketSession.getChannel(), webSocketClientMessage);
});
}
/**
* 添加通道绑定通道与会话
*
@ -91,8 +113,8 @@ public class WebSocketChannelManager implements IWebSocketChannelManager {
* @param clientName 客户端名称
* @return
*/
public WebSocketSession getOnlineUser(String userId, String clientName) {
return webSocketUserSessionManager.getOnlineUser(userId, clientName);
public List<WebSocketSession> listOnlineUser(String userId, String clientName) {
return webSocketUserSessionManager.listOnlineUser(userId, clientName);
}
/**