增加 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 客户端名称 * @param clientName 客户端名称
* @return * @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) { public void setUpdateTime(Long updateTime) {
this.updateTime = 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)}) @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
@GetMapping("login/{clientName}") @GetMapping("login/{clientName}")
public SuccessResultData<String> login(@RequestHeader("token") String token, @PathVariable("clientName") String clientName) { public SuccessResultData<String> login(@RequestHeader("token") String token, @PathVariable("clientName") String clientName) {
System.out.println(">>>> token" + token);
String sessionId = webSocketClientService.login(token, clientName); String sessionId = webSocketClientService.login(token, clientName);
return new SuccessResultData<>(sessionId); return new SuccessResultData<>(sessionId);
} }

View File

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

View File

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

View File

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

View File

@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
import ink.wgink.exceptions.websocket.SessionException; import ink.wgink.exceptions.websocket.SessionException;
import ink.wgink.interfaces.manager.IWebSocketChannelManager; import ink.wgink.interfaces.manager.IWebSocketChannelManager;
import ink.wgink.interfaces.manager.IWebSocketUserSessionManager; 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.module.instantmessage.websocket.pojo.WebSocketClientMessage;
import ink.wgink.pojo.session.WebSocketSession; import ink.wgink.pojo.session.WebSocketSession;
import ink.wgink.properties.websocket.WebSocketProperties; import ink.wgink.properties.websocket.WebSocketProperties;
@ -49,6 +50,27 @@ public class WebSocketChannelManager implements IWebSocketChannelManager {
webSocketUserSessionManager.init(userId, sessionId, clientName); 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 客户端名称 * @param clientName 客户端名称
* @return * @return
*/ */
public WebSocketSession getOnlineUser(String userId, String clientName) { public List<WebSocketSession> listOnlineUser(String userId, String clientName) {
return webSocketUserSessionManager.getOnlineUser(userId, clientName); return webSocketUserSessionManager.listOnlineUser(userId, clientName);
} }
/** /**