Pig Cloud遇到websocket不能实现同一个用户不同浏览器接受到广播的消息解决方案

自定义SecuritySessionKeyGenerator类,为每个客户端连接建立唯一的key

java 复制代码
package com.pig4cloud.plugin.websocket.custom;

import com.pig4cloud.plugin.websocket.holder.SessionKeyGenerator;
import org.springframework.web.socket.WebSocketSession;

import java.util.UUID;
public class SecuritySessionKeyGenerator implements SessionKeyGenerator {
	@Override
	public Object sessionKey(WebSocketSession webSocketSession) {
		Object user = webSocketSession.getAttributes().get("USER_KEY_ATTR_NAME");
		// 添加随机后缀使每个连接键唯一
		return user != null ? user + "-" + UUID.randomUUID().toString() : null;
	}
}

重写WebSocketSessionHolder类方法

java 复制代码
package com.pig4cloud.plugin.websocket.holder;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

import org.springframework.web.socket.WebSocketSession;

public final class WebSocketSessionHolder {
	// 仅修改这一行:将Value改为Set类型
	private static final Map<String, Set<WebSocketSession>> USER_SESSION_MAP = new ConcurrentHashMap<>();

	private WebSocketSessionHolder() {
	}

	public static void addSession(Object sessionKey, WebSocketSession session) {
		// 修改为支持多会话的添加方式
		USER_SESSION_MAP.computeIfAbsent(sessionKey.toString(),
				k -> new CopyOnWriteArraySet<>()).add(session);
	}

	public static void removeSession(Object sessionKey) {
		// 移除时不再自动清除所有会话
		Set<WebSocketSession> sessions = USER_SESSION_MAP.get(sessionKey.toString());
		if (sessions != null) {
			sessions.removeIf(s -> !s.isOpen()); // 只移除已关闭的连接
			if (sessions.isEmpty()) {
				USER_SESSION_MAP.remove(sessionKey.toString());
			}
		}
	}

	// 保持原有方法签名不变(兼容现有调用)
	public static WebSocketSession getSession(Object sessionKey) {
		Set<WebSocketSession> sessions = USER_SESSION_MAP.get(sessionKey.toString());
		return sessions != null ? sessions.stream().findFirst().orElse(null) : null;
	}

	// 新增方法:获取用户的所有会话
	public static Set<WebSocketSession> getSessions(Object sessionKey) {
		return USER_SESSION_MAP.getOrDefault(sessionKey.toString(), Collections.emptySet());
	}

	// 保持原有方法不变
	public static Collection<WebSocketSession> getSessions() {
		List<WebSocketSession> allSessions = new ArrayList<>();
		USER_SESSION_MAP.values().forEach(allSessions::addAll);
		return allSessions;
	}

	// 保持原有方法不变
	public static Set<String> getSessionKeys() {
		return USER_SESSION_MAP.keySet();
	}
}
相关推荐
星恒讯工业路由器21 分钟前
4G自组网与VPDN专网技术解析
网络·物联网·信息与通信·4g自组网·vpdn专网
淼淼爱喝水29 分钟前
DVWA靶场命令注入漏洞检测实验
网络·安全·靶场·dvwa
daqinzl42 分钟前
Mpegts.js+FFmpeg+WebSocket+Node实时视频流实现方案
websocket·ffmpeg·node·mpegts.js
KaMeidebaby1 小时前
卡梅德生物技术快报|免疫共沉淀 - Co-IP 实验在转录因子 ATF3/Smad4 蛋白互作研究中的应用实例解析
网络·人工智能·网络协议·tcp/ip·其他·算法·新浪微博
林熙蕾LXL1 小时前
IPC使用套接字进程通讯
网络
宋浮檀s1 小时前
应急响应——Web高危漏洞应急(SQL注入+XSS跨站+文件上传)
前端·网络·安全·web安全·xss
阿部多瑞 ABU1 小时前
一次针对大语言模型的“虚构历史前提注入”红队测试实录:当AI相信了不存在的对话历史
网络·人工智能·安全
Lsland..2 小时前
MCP协议AI时代的HTTP
人工智能·网络协议·http
AIFQuant2 小时前
外汇交易平台技术栈深度解析:行情 API、清算、风控、前端一体化方案
前端·python·websocket·金融·restful
ylscode10 小时前
PureLogs 信息窃取恶意软件惊现高危变种:借道 MsBuild.exe 进程空心化实施无痕攻击
网络·安全·安全威胁分析