DDP 呼叫拦截
Posted
技术标签:
【中文标题】DDP 呼叫拦截【英文标题】:DDP call interception 【发布时间】:2015-09-06 19:44:22 【问题描述】:我正在考虑当 Meteor 客户端(或 DDP 客户端)为我的 Meteor Js 项目执行横切/AOP 或其他功能在服务器上的场景通过 DDP 连接调用服务器端方法。
此链接here 提供了一个非常好的示例,说明如何对对象执行 AOP,但我想知道是否有一种方法可以通过 DDP 连接侦听入站客户端请求,就像 express-interceptor 或操作过滤器一样asp.net web api,但当然,用于 websocket/ddp rpc 实现。
Meteor Js Api 仅描述服务器上的一个事件“onConnection”。而这个SO 回复提到了一个connection._send 在客户端上执行某些AOP 功能......但除此之外没有找到一大堆官方文档。
我基本上想知道是否有一种方法可以在服务器监听所有 DDP 方法调用从所有客户端会话到服务器,如 DDP 规范中所述here
谢谢。
【问题讨论】:
【参考方案1】:我们会在 Meteor 中找到很多未记录的内容。我真的不认为这是一个问题。以下是 Meteor 中拦截 WebSocket 流量的一些方法:
服务器
您可以从服务器执行以下操作:
Server
-> 客户
截取从服务器到客户端的消息有点繁琐,但这是可行的。您可能想要编写一些代码将log
s 固定到客户端。
(function ()
var timeout = 3000
var streamServer = Meteor.server.stream_server
var standardConnect = streamServer.server._events.connection
streamServer.server._events.connection = function (socket)
var write = socket.write
socket.write = function ()
console.log(arguments)
write.apply(this, args)
standardConnect.apply(this, arguments)
)()
客户端 -> Server
要拦截来自服务器上的客户端的调用,您可以这样做:
Meteor.server.stream_server.server.addListener('connection', function (socket)
var old = socket._events.data
socket._events.data = function ()
console.log(arguments)
old.apply(this, arguments)
)
上面的啜饮不能与第一个一起使用。修面团并不难。如果你使用这个片段,Meteor.server.stream_server.server._events.connection
将只是一个函数数组而不是一个函数。
客户
服务器->Client
要在在客户端上监听从服务器到客户端的调用,您可以这样做:
Meteor.connection._stream.on('message', console.log.bind(console))
您也可以使用类似这样的方式拦截它们
(function ()
var cb = Meteor.connection._stream.eventCallbacks.message[0]
Meteor.connection._stream.eventCallbacks.message[0] = function ()
console.log(arguments)
cb.apply(this, arguments)
)()
不完全确定它有多坚固。但它有效,那又怎样。
要测试它,你可以简单地做
Meteor.subscribe('test')
Client
-> 服务器
正如您所指出的,您还可以对来自客户端的传出消息执行类似操作。
Meteor.connection._send = function ()
console.log(arguments)
this.__proto__._send.apply(this, arguments)
【讨论】:
这很好,感谢您的建议,但是有没有办法在服务器上拦截 RPC 调用? Meteor.connection 似乎只在客户端可用。 没有什么是稍微挖掘一下就能找到的。我编辑了我的答案。您能否编辑您的问题以包含一个明确的问题? 嗯...我只是强调了原始问题的部分内容,如果这样更清楚的话。我会玩弄你的发现,看看它是否提供了我正在寻找的东西。再次感谢。 据我所知,我可以使用 Kriegslutig 的建议在服务器上拦截连接会话的开始,但之后无法拦截调用。在实际调用方法之前,我在 Meteor.server 对象结构中没有找到任何东西来捕获传输级别(DDP 层)的各个 DDP 方法请求:-(以上是关于DDP 呼叫拦截的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )