2013-03-14 161 views
3

我用下面的脚本 -访问控制允许来源错误

<!DOCTYPE html> 
<html> 
<head> 
<script src="jquery-1.9.1.min.js"></script> 
<script> 
function postForm() { 

    $.ajax({ 
      type: 'POST', 
      url: 'http://10.0.0.8:9000/demo', 
      data: {"name" : "test"}, 
      contentType: "application/json; charset=utf-8", 
      dataType: 'json', 
     }) 
    } 

</script> 
</head> 
<body> 
    <form id="ajaxForm" onsubmit="postForm(); return false; " method="post"> 
     <input id="test" type="text" name="name" value="Hello JSON" /> 
     <input type="submit" value="Submit JSON" /> 
    </form> 

</body> 
</html> 

我试图访问该计算机正在运行的游戏框架。我收到以下错误:

OPTIONS http://10.0.0.8:9000/demo 404(未找到)的jquery-1.9.1.min.js:5 的XMLHttpRequest不能加载http://10.0.0.8:9000/demo。 Access-Control-Allow-Origin不允许产生http://localhost:8080

我已经被困了两天,任何人都可以帮我吗?

感谢提前

+1

注意:'contentType'是'**内容类型'标头***发送给**请求**中的服务器!这不是***回应的“内容类型”。这里不正确。 – 2013-03-14 14:50:14

+0

这是另一种解决方案; http://stackoverflow.com/questions/7564832/how-to-bypass-access-control-allow-origin/17098221#17098221 – 2014-02-26 21:07:58

回答

19

的问题是,你想使一个跨域调用(从http://localhost:8080http://localhost:9000)。这是Same Origin Policy所不允许的,所以浏览器试图使用Cross-Origin Resource Sharing询问服务器是否允许跨源呼叫。 (这是您看到的OPTIONS HTTP请求。)由于服务器不回复OPTIONS请求,并且头部允许进行呼叫,出于安全原因,它会被浏览器拒绝。

SOP适用于所有真正的“ajax”调用(例如,通过XMLHttpRequest)。您可以:

  1. 更新实施到OPTIONS请求回传的标题,可让呼叫(这将使它在most modern browsers工作)的响应服务器,或

  2. 使请求相同的端口(我猜你有没有这样做的原因),所以请求是相同的来源和SOP不适用,或

  3. 切换到使用JSON-P。但JSON-P不适用于表单提交,因为它是GET,并且GET的操作应该是idempotent,而大多数表单提交不是。因此,除非这是一个幂等的表单提交(例如,搜索),否则使用JSON-P就会成为黑客。

+1

谢谢你的快速答案TJ,我会投票,如果我有足够的代表... – Gidon 2013-03-14 15:29:15

+0

如果您使用apache作为本地主机,您是否有关于如何“更新服务器以实现对OPTIONS的响应”的链接? – 2014-10-26 14:52:31

相关问题