如何绕过 Angular 使用自己的猴子补丁来撤消我的猴子补丁?

Posted

技术标签:

【中文标题】如何绕过 Angular 使用自己的猴子补丁来撤消我的猴子补丁?【英文标题】:How do I get around Angular undoing my monkey patching with its own monkey patching? 【发布时间】:2019-10-27 22:12:45 【问题描述】:

我想拦截 Google Maps API 的 XHR 请求,以便我可以通过我自己的代理服务器运行它们,以此来保护我的 API 密钥的私密性。

Angular 有自己的 HttpInterceptors,但它们只会拦截使用 Angular 的 HttpClient 发出的 XHR 请求,而不是 Maps API 在 Angular 框架之外发出的任何请求。我认为猴子修补 XMLHttpRequest.open() 将是获取前往 Maps API 的请求的最佳方式,我已经这样做了:

  var oldXHROpen = XMLHttpRequest.prototype.open;

  XMLHttpRequest.prototype.open = function(method, url, async, username, password) 
    console.log(url);
    return oldXHROpen.apply(this, arguments);
  ;

上面的代码放在我的index.html<head> 部分的<script> 中,所以它肯定会在执行任何Angular 代码之前执行。

补丁可以工作......很短的时间。我看到我的代码加载的一些资产的 URL 已注销,但随后出现以下消息:

Angular is running in the development mode. Call enableProdMode() to enable the production mode.

之后,只记录了一个 URL,这是我进行的最后一次拦截。 XHR 请求继续被处理,但我的补丁从未看到它们发生。

我确定这与 zone.js 有关,但我仍然不明白它是如何发生的。由于我在 Angular 或 zone.js 之前重新定义了XMLHttpRequest.prototype.open,甚至有机会看到隐藏在oldXHROpen 变量中的原始open() 函数,如何直接连接到本机open()再次发生,绕过我的补丁?

【问题讨论】:

只是抛出一些想法:它不一定将 open 连接回本机,它可以阻止调用您的修补方法 我试图复制它但不能:codesandbox.io/s/angular-mo2on。也许问题出在另一座城堡中 你尝试过 Angular 自己的proxyConfig 机制吗? github.com/angular/angular-cli/blob/master/docs/documentation/… @Andrey,即使在我的情况下,也发生了 some 拦截,但几次之后就停止了。我想它甚至可能是特定于开发环境的,因为记录的最后一个请求是到 localhost,我认为这是用于检查应用程序是否应该重新启动的调用之一,因为代码可能已经更改。 @mbojko,我还没有,但稍后我会更详细地介绍。一眼看去,我无法判断该代理是否通过 HttpClient。如果它使用 HttpClient,它在这里没有帮助。 【参考方案1】:

看来我是在一个错误的前提下工作的,即 Google Maps API 的客户端必须发出 XHR 请求才能完成其工作。

它没有。这一切都是通过加载图像、CSS 和字体来完成的,并添加了一点 JSONP。

我的猴子补丁确实有效,没有被 Angular 撤消。

【讨论】:

以上是关于如何绕过 Angular 使用自己的猴子补丁来撤消我的猴子补丁?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Java 中进行猴子补丁?

猴子补丁的应用,猴子补丁来改变日志。

gevent猴子补丁和断点

如何包装(猴子补丁)@classmethod

您如何检测到 Ruby 中发生了猴子补丁?

ruby 可选的Jekyll猴子补丁使用终端通知器来指示Jekyll构建完成。放入_plugins / ext.rb