2015-05-09 37 views
0

对这个问题的工作页面,我写了下面的脚本:发布使用XMLHttpRequest的

window.onload = function() { 
    var request = new XMLHttpRequest(); 
    var url = "http://localhost:3000/say_hello"; 
    var params = "username=FooMan"; 

    request.onreadystatechange = function() { 
     if (request.readyState == 4 && request.status == 200) { 
      console.log(request.responseText); 
     } 
    } 
    request.open("POST", url, true); 
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    request.withCredentials = true; 
    request.send(params); 
} 

但是每次我试图执行脚本我得到

XMLHttpRequest cannot load http://localhost:3000/say_hello. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. 

我已经尝试使用

request.setRequestHeader("Access-Control-Allow-Origin", "*"); 
request.setRequestHeader("Access-Control-Allow-Origin", "hello.html"); 

浏览器是Chrome。我做错了什么或失踪?

+1

'Access-Control-Allow-Origin'标题需要在服务器端设置,而不是客户端。您的后端使用什么语言编写? – AlliterativeAlice

+0

@AlliterativeAlice红宝石在Rails的 – cybertextron

+0

对于本地解决跨起源问题,您可以安装[允许控制允许原产地插件(https://chrome.google.com/webstore/detail/allow-control-allow -origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl = en) – sfletche

回答

0

Access-Control-Allow-Origin头需要在服务器侧设置并在响应中,在所述请求中的客户机侧没有设置发送。在Rails这可以通过将下面的代码在你的控制器来实现:

headers['Access-Control-Allow-Origin'] = '*' 
headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, OPTIONS' 
headers['Access-Control-Request-Method'] = '*' 
headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization' 

欲了解更多信息,请参阅Allow anything through CORS Policy

0

您正在运行到同一来源的安全限制。默认情况下,不允许使用Javascript将Ajax调用发送到具有与脚本运行网页不同的来源(域,端口和协议)的服务器。

在您的特定情况下,您的错误的这一部分消息:

Origin 'null' is therefore not allowed access. 

表示你可能(硬盘驱动器上的一个)运行的本地网页和脚本正在从通过Ajax访问外部服务器阻塞。

如果脚本中的实际的Web服务器上运行的网页(而不是从本地硬盘驱动器),那么,在默认情况下,Ajax调用可以只向同一个web服务器。如果您想对其他服务器进行Ajax调用,那么您需要一个协作服务器才能与其他服务器进行通信。

要进行普通的Ajax调用,服务器必须指定Access-Control-Allow-Origin标头,告诉主机浏览器可以接受来自除服务器本身以外的某些域的Ajax调用。这被称为CORS(跨源资源共享)。您可以阅读更多关于如何使用CORS here on MDN的信息。您不能从客户端设置这些标头 - 它们必须从服务器进行设置。它是必须授予浏览器访问权限的服务器,而不是其他方式。

除了CORS,JSONP也是一个变通跨站点的访问。

CORS和JSONP都需要来自主机服务器的合作以允许跨源访问。而且,即使使用CORS或JSONP,如果网页从本地文件系统(而不是实际的Web服务器)上运行,某些浏览器(如Chrome)仍会阻止访问。在运行浏览器进行开发之前,可​​以使用命令行选项临时绕过此限制,但这显然不是一种通用的解决方案。

+0

@philippe - 这是否回答你的问题? – jfriend00

相关问题