增加 websocket 单设备登录
This commit is contained in:
parent
40dda4e47a
commit
40d103963b
@ -59,7 +59,7 @@ public interface IWebSocketUserSessionManager {
|
||||
* @param clientName 客户端名称
|
||||
* @return
|
||||
*/
|
||||
WebSocketSession getOnlineUser(String userId, String clientName);
|
||||
List<WebSocketSession> listOnlineUser(String userId, String clientName);
|
||||
|
||||
/**
|
||||
* 在线会话列表
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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, "链接消息"),
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user