我想知道是否有一个JavaScript库,它可以覆盖XMLHttpRequest
并允许透明地处理所有跨域请求,并通过我的同源服务器端代理无缝转发它们。
我想要的是一个通用的解决方案,它可以与任何JavaScript库一起使用来发出跨域请求(例如跨域jQuery.ajax()
)。
使用这样的库有什么缺点吗(安全问题、HTTPS 访问等)?
更新:
如果这样的库已经由某人创建,那么我只是不想重新发明轮子并再次处理所有极端情况。
如果您只需要将每个请求重定向到特定的代理,您可以简单地自己编写,
例如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 域 cookie 被阻止 - 只要您不输入带有标头 Access-Control-Allow-Credentials的字段)。
一些安全隐患相当明显:
- 您正在代理请求,因此代理本身将可以访问所有内容,无论加密如何
- 将要求代理进行HTTPS处理(如果远程URL是安全的),并且客户端将无法(或者,另一方面,如果向代理要求,则不需要)直接验证服务器证书
更复杂的(相同的域,以完全支持 cookie)代理实现甚至可以为重写标头的跨域请求提供基本的会话处理:
- 客户端请求从没有 cookie 的 www.mydomain.comwww.remotedomain.com/querystring
- 请求被重写为 proxy.mydomain.com/www.remotedomain.com/querystring
代理向 www.remotedomain.com/querystring 发出请求,该请求以标头响应
设置-Cookie: 名称=值; 路径=/; 过期 星期一, 31-十二月-2012 23:59:59 GMT
客户端接收带有标头的响应
设置-Cookie: 名称=值; 路径=/www.remotedomain.com; 过期 星期一, 31-十二月-2012 23:59:59 GMT
在下一个请求中,客户端将发送cookie,代理将仅将它们转发到远程服务
但我可能离题太多了。 :)
我不会将JS用于这种需求...只需对服务器上充当代理的 PHP 文件(或其他文件)进行所有 AJAX 调用即可。
它只需要接收你想要调用的网址,POST或GET参数,然后制作一个cURL到外部服务器。
作为回报,它将打印 cURL 请求的输出。