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 -> 客户

截取从服务器到客户端的消息有点繁琐,但这是可行的。您可能想要编写一些代码将logs 固定到客户端。

(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 上拦截来电

Android studio 实战演练,拦截史迪仔程序代码

Android 逆向函数拦截 ( GOT 表拦截 与 插桩拦截 | 插桩拦截简介 | 插桩拦截涉及的 ARM 和 x86 中的跳转指令 )

WebService 拦截器

MyBatis拦截器原理介绍

Okhttp3拦截器-应用拦截器和网络拦截器的区别