You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现WebSocket消息拦截?已有AJAX请求拦截实现参考

实现思路和你拦截AJAX的逻辑类似,通过重写浏览器原生WebSocket构造函数注入监听逻辑即可,具体实现代码如下:

// 缓存原生WebSocket构造函数
const OriginalWebSocket = window.WebSocket;
// 定义全局变量存储最近一次收到的WebSocket消息
window.lastWsMessage = '';

// 重写全局WebSocket构造函数
window.WebSocket = function(url, protocols) {
  // 初始化原生WebSocket实例
  const wsInstance = new OriginalWebSocket(url, protocols);

  // 拦截通过onmessage直接绑定的消息回调
  const originalOnMessage = wsInstance.onmessage;
  wsInstance.onmessage = function(event) {
    window.lastWsMessage = event.data;
    // 执行原有业务逻辑,不影响页面原有功能
    if (originalOnMessage) {
      return originalOnMessage.apply(this, arguments);
    }
  };

  // 拦截通过addEventListener绑定的message事件
  const originalAddEventListener = wsInstance.addEventListener;
  wsInstance.addEventListener = function(type, listener, options) {
    if (type === 'message') {
      // 包装原有监听器,插入消息存储逻辑
      const wrappedListener = function(event) {
        window.lastWsMessage = event.data;
        return listener.apply(this, arguments);
      };
      return originalAddEventListener.call(this, type, wrappedListener, options);
    }
    return originalAddEventListener.apply(this, arguments);
  };

  return wsInstance;
};

// 拷贝原生WebSocket的静态属性和方法,避免部分场景报错
Object.assign(window.WebSocket, OriginalWebSocket);

上述代码会自动拦截所有WebSocket连接收到的消息,全局变量lastWsMessage会始终存储最近一次的消息内容,和你之前用的lastXhr效果完全一致。

如果你还需要拦截客户端主动发送的WebSocket消息,可以补充以下代码:

const originalSend = OriginalWebSocket.prototype.send;
OriginalWebSocket.prototype.send = function(data) {
  // 按需添加存储最近发送消息的逻辑
  // window.lastWsSendData = data;
  return originalSend.apply(this, arguments);
};

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:24:04