javascript - 如何绕过 Angular 使用自己的猴子补丁来撤消我的猴子补丁?
问题描述
我想拦截 Google Maps API 的 XHR 请求,这样我就可以通过我自己的代理服务器运行它们,以此来保护我的 API 密钥的私密性。
Angular 有自己的HttpInterceptor
s,但它们只会拦截使用 Angular 发出的 XHR 请求,而HttpClient
不是 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);
};
上面的代码放在my 部分的a<script>
中,所以它肯定会在执行任何 Angular 代码之前执行。<head>
index.html
该补丁工作......很短的时间。我看到我的代码加载的一些资产的 URL 已注销,但随后出现以下消息:
Angular is running in the development mode. Call enableProdMode() to enable the production mode.
之后,只记录了一个 URL,这是我最后一次拦截。XHR 请求继续被处理,但我的补丁从未看到它们发生。
我确定这与 zone.js 有关,但我仍然不明白它是如何发生的。由于我XMLHttpRequest.prototype.open
在 Angular 或 zone.js 之前重新定义了甚至有机会看到open()
隐藏在oldXHROpen
变量中的原始函数,所以open()
绕过我的补丁,如何再次成功地与本机连接?
解决方案
看来我是在一个错误的前提下工作的,即 Google Maps API 的客户端必须发出 XHR 请求才能完成其工作。
它没有。这一切都是通过加载图像、CSS 和字体来完成的,并添加了一点 JSONP。
我的猴子补丁确实有效,并且不会被 Angular 撤消。
推荐阅读
- reactjs - 在我的第一个 NextJS / React 应用程序上出现网络错误
- matlab - 在 Matlab 中拆分长命令以提高速度
- python - re.split - micropython - 为什么它不起作用?
- ios - 'MyViewController' 中不明确的类型名称 'Coordinator'
- git - filter-branch --tree-filter 与 .gitignore
- spotify - spotipy 查询不从 spotify 返回结果集
- php - PHP AJAX 在某些目录中复制 cookie
- java - java.lang.ClassCastException: android.widget.LinearLayout 不能转换为 android.widget
- android - 从firebase查询recyclerView的问题
- visual-studio - Visual Studio 代码无法连接到 jupytner 笔记本