【问题标题】:Overriden XMLHttpRequest for cross-domain requests为跨域请求重写 XMLHttpRequest
【发布时间】:2025-12-18 11:20:04
【问题描述】:

我想知道是否有一个 JavaScript 库,它覆盖 XMLHttpRequest 并允许透明地处理所有跨域请求并通过我的同源服务器端代理无缝转发它们。

我想要的是有一个通用的解决方案,它可以与 any JavaScript 库一起使用以发出跨域请求(例如与跨域jQuery.ajax())。

使用此类库是否有任何缺点(安全问题、HTTPS 访问等)?

更新:

如果这样的库已经由某人创建,那么我只是不想重新发明*并再次处理所有极端情况。

【问题讨论】:

  • 这样的库需要包含服务器端脚本,或者至少定义它的接口。
  • 我从未见过一个库会覆盖本机函数以改变其(标准)行为
  • @JanDvorak 当然,我已准备好将所有内容添加到服务器端,尤其是使用 Java 时。
  • @Bergi “扩展”怎么样,“改变”这个词更好吗?
  • @JanDvorak:即使是标准化行为的扩展,也很少在与原始功能相同的地方实现。我不确定 OP 的“透明”究竟是什么意思,只是将外部 URL 传递到 XMLHttpRequest 听起来不是一个好主意。例如,jQuery 不能很好地处理它,因为它会在调用 XHR 之前检查跨域 url。

标签: javascript cross-domain


【解决方案1】:

如果您只需要将每个请求重定向到特定代理,您可以简单地自己编写,在

XMLHttpRequest.prototype.oldOpen = XMLHttpRequest.prototype.open;
var newOpen = function(args) {
   //overwrite arguments changing the original url to the proxy one, 
   //and add a parameter/header to send the original url to the proxy
   this.oldOpen(args);    
}
XMLHttpRequest.prototype.open = newOpen;

由于代理在同一个域(如果要允许x域代理请求,只需添加Access-Control-Allow-Origin头),它不会发送任何远程域的cookie(你赢了'无论如何都不要拥有它们,因为 x-domains cookie 被阻止 - 只要您不输入带有标题 Access-Control-Allow-Credentials 的字段)。

一些安全隐患相当明显:

  • 您正在代理请求,因此无论加密如何,代理本身都可以访问所有内容
  • 将要求代理进行 HTTPS 处理(如果远程 URL 是安全的),客户端将无法(或者,另一方面,如果要求代理,则不需要)直接验证服务器证书

更复杂的(相同域,完全支持 cookie)代理实现甚至可以为重写标头的跨域请求提供基本会话处理:

  1. 客户端请求 www.remotedomain.com/querystring 来自 www.mydomain.com 没有 cookie
  2. 请求被重写为proxy.mydomain.com/www.remotedomain.com/querystring
  3. 代理向 www.remotedomain.com/querystring 发出请求,该请求以标头响应

    设置 Cookie:名称=值;路径=/;将于 2012 年 12 月 31 日星期一 23:59:59 GMT 到期

  4. 客户端收到带有标头的响应

    设置 Cookie:名称=值;路径=/www.remotedomain.com;将于 2012 年 12 月 31 日星期一 23:59:59 GMT 到期

  5. 在下一次请求时,客户端将发送 cookie,代理会将它们转发到远程服务

但我可能离题太多了。 :)

【讨论】:

  • 其实问题是关于同一个域中的代理。但是使用 Access-Control-Allow-Origin 标头,您的解决方案会变得更加有趣。
【解决方案2】:

我不会使用 JS 来满足这种需求...只需将所有 AJAX 调用调用到服务器上充当代理的 PHP 文件(或其他文件)即可。

它只需要接收你要调用的url,POST或GET参数,然后做一个cURL到外部服务器。

作为回报,它将打印 cURL 请求的输出。

【讨论】: