增加 websocket 单设备登录
This commit is contained in:
parent
40dda4e47a
commit
40d103963b
@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 在线会话列表
|
* 在线会话列表
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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, "链接消息"),
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user