检查是否适用相同的原始政策

Dav*_*ing 24 javascript ajax jquery cross-domain cross-domain-policy

在实际尝试使用ajax方法之前,是否有"安全"的方法来检查相同的原始策略是否适用于URL?这是我有的:

function testSameOrigin(url) {

    var loc = window.location,
        a = document.createElement('a');

    a.href = url;

    return a.hostname == loc.hostname &&
           a.port == loc.port &&
           a.protocol == loc.protocol;
}
Run Code Online (Sandbox Code Playgroud)

这种作品,但它是一种基于维基百科文章的手动猜测.有没有更好的方法来预先检查跨域允许?jQuery可以使用.

Dag*_*bit 15

在实际尝试使用ajax方法之前,是否有"安全"的方法来检查相同的原始策略是否适用于URL?这是我有的:

function testSameOrigin(url) {

    var loc = window.location,
        a = document.createElement('a');

    a.href = url;

    return a.hostname == loc.hostname &&
           a.port == loc.port &&
           a.protocol == loc.protocol;
}
Run Code Online (Sandbox Code Playgroud)

这是一种安全可靠的方法,只要您正在做(或者更确切地说不做)某些事情.

这种作品,但它是一种基于维基百科文章的手动猜测.

这应该在"正常"情况下完全奏效.如果您计划使用跨域脚本,则需要进行修改.

如果您document.domain在脚本中修改,例如从"foo.example.com"和"bar.example.com"修改为"example.com",您的testSameOrigin函数将返回false" http://example.com ",其中实际上它应该回来true.

如果您计划进行修改document.domain,可以在脚本中添加一个检查.

如果您计划使用CORS(请参阅上面的链接)以允许跨域通信,它也将返回错误否定.但是如果您使用的是CORS,则会有一个可以与之通信的域列表,您也可以将该列表添加到此功能中.

有没有更好的方法来预先检查跨域允许?jQuery可以使用.

可能不是,虽然可能值得一提的是,你在Steve的回答中看到的那个问题可能就是"观察者的困境"......那些错误看起来就像是控制台试图检查另一个窗口而不是来自剧本.

假设您没有使用document.domain或使用CORS,原始解决方案可能更好,因为它不需要额外请求来确定服务器是否可用.即使您正在进行一些跨域脚本编写,修改现在可以容纳它的功能可能是您最好的选择.


Ste*_*eve 8

有趣的问题!我四处搜索,除了你发布的内容之外找不到任何东西,但是当我搞乱一些测试代码时,我确实遇到了这个问题.如果您只想要一种简单的方法来测试URL而不需要请求,我会按照您的方式进行操作.如果您不关心提出测试请求,您可以尝试这样做:

对您想要的任何URL发出简单的ajax请求:

var ajaxRequest = $.ajax({
  url: 'http://www.google.com',
  async: false
});
Run Code Online (Sandbox Code Playgroud)

返回一个jqXHR对象,然后您可以检查:

ajaxRequest.isRejected(); // or...
ajaxRequest.isResolved();
Run Code Online (Sandbox Code Playgroud)

现在,唯一的问题是,isRejected()将评估true页面未加载的每个案例(即404 Not Found等),但您可以使用以下命令检查状态代码:

ajaxRequest.status;
Run Code Online (Sandbox Code Playgroud)

0当您尝试中断相同的原始策略时,上面的行似乎会返回,但在其他情况下它将返回相应的错误代码(再次,即404).

所以要结束,也许你可以尝试做类似的事情:

function testSameOrigin(testUrl) {

  var ajaxRequest = $.ajax({
    url: testUrl,
    async: false
  });

  return ajaxRequest.isRejected() && ajaxRequest.status === 0;
}
Run Code Online (Sandbox Code Playgroud)

无论如何不是一个明确的答案,但我希望它可以帮助你弄清楚你在寻找什么!