覆盖跨域请求的XMLHttpRequest

Yah*_*hor 2 javascript cross-domain

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

我想要的是有一个通用的解决方案,可以与任何 JavaScript库一起使用来制作跨域请求(例如,使用跨域jQuery.ajax()).

使用此类库存在任何缺点(安全问题,HTTPS访问等)吗?

更新:

如果这样的库已经由某人创建,那么我只是不想重新发明轮子并再次处理所有角落情况.

psy*_*ood 6

如果你只需要将每个请求重定向到一个特定的代理,你可以自己编写,有些内容

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;
Run Code Online (Sandbox Code Playgroud)

由于代理位于同一个域中(如果您想允许x-domain代理请求,只需添加Access-Control-Allow-Origin标头),它将不会被发送到远程域的任何cookie(您不会无论如何,因为x-domains cookie被阻止 - 只要你没有输入标题为Access-Control-Allow-Credentials的字段.

一些安全隐患相当明显:

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

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

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

    Set-Cookie:name = value; 路径= /; 到期日,星期一,2012年12月31日23:59:59 GMT

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

    Set-Cookie:name = value; 路径=/www.remotedomain.com; 到期日,星期一,2012年12月31日23:59:59 GMT

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

但我可能太过分了.:)