对于 AJAX 请求,可以使用以下代码:
let oldXHROpen = window.XMLHttpRequest.prototype.open;
window.lastXhr = '';
window.XMLHttpRequest.prototype.open = function(method, url, async, user, password) {
this.addEventListener('load', function() {
window.lastXhr = this.responseText;
});
return oldXHROpen.apply(this, arguments);
};
lastXhr
变量将保存最后一个响应。
但是如何才能让websockets也做到这一点呢?
5条答案
按热度按时间p1iqtdky1#
你需要尽快做这个 Package
@brunoff你是对的,因为你总是可以在服务器之前通过傀儡窗口逻辑使用你的函数,或者你可以从
MessageEvent
本身劫持data
:您可以尝试在this page上的控制台中放入代码并运行它,然后运行他们的WebSocket示例。
vcudknz32#
要拦截消息,您必须监视
onmessage = fn
和addEventListener("message", fn)
调用。为了能够修改
onmessage
,我们首先必须覆盖全局WebSocket
,下面是拦截传入消息的方法,但是您可以通过类似的方法监视send
方法以拦截传出消息(客户端发送到服务器的消息)。我使用Firebase在一个页面上测试了这个功能,它工作得很好,但是您必须在其他脚本之前初始化它,以确保WebSocket库(可以是socket.io、ws等)正在使用覆盖的
WebSocket
构造函数。监视传入消息 * 并 * 修改
data
最后,您可以在调用真实的的消息侦听器之前覆盖
data
-如果您无法控制页面功能,并且希望将自己的数据注入到消息侦听器中,这将非常方便。如果不需要修改数据,可以按照第二部分的答案进行。
在不修改数据的情况下监视传入消息
如果您想只监听消息,而不覆盖数据,事情就简单多了:
监视传出消息
以非常类似的方式,您可以代理用于向服务器发送数据的
send
方法。如果有什么不清楚的地方,请随便问。
eulz3vhy3#
在一个与您的解决方案类似的解决方案中,
window.XMLHttpRequest
被替换为提供window.lastXhr
的 Package 版本,我们将window.WebSockets
替换为提供window.WebSocketMessages
的 Package 版本,该 Package 版本提供从在此脚本之后创建的所有websocket接收到的所有消息和时间戳。与XMLRequest的情况不同,WebSocket可能已经存在。如果你需要保证所有的websocket都能被捕获,那么你需要尽快做这个 Package 器。如果你做不到,那么有一个不太好的技巧来捕获已经存在的websocket:
这是不那么可信的,因为如果他们不发送,但接收,他们将保持不被注意。
vybvopom4#
如果您正在使用nodejs,则可以使用
socket.io
安装后,可以使用
socket.io
中间件1dkrff035#
简介
问题/bounty/op特别要求一个有信誉的源代码,我的建议是使用一个已知的成熟库,而不是一个定制的解决方案,这个库已经被社区使用、审计、分支和普遍使用,并且托管在github上。
第二种选择是自己卷(虽然不推荐),关于如何做,有很多优秀的答案涉及
addEventListener
摇了摇
Wshaked是一个库(托管在github上),允许轻松拦截和修改WebSocket请求和消息事件。它已经被多次加星和分叉。
免责声明:我与具体项目没有任何关系。strong text
示例:
从文档中,您将发现:
在调用实际WebSocket的send()方法之前调用。
此方法必须返回也可以修改的数据。
在从WebSocket服务器接收MessageEvent之后、调用WebSocket的onmessage事件处理程序之前调用。
Web套接字添加事件侦听器
WebSocket对象支持
.addEventListener()
。请参见:Multiple Handlers for Websocket Javascript