Cors XmlHttpRequest 和响应

Posted

技术标签:

【中文标题】Cors XmlHttpRequest 和响应【英文标题】:Cors XmlHttpRequest and Response 【发布时间】:2012-06-04 00:10:23 【问题描述】:

任务描述

我正在创建一个具有客户端/服务器架构的程序。服务器是运行在用户浏览器中的 javascript 脚本,客户端是运行在用户本地机器上的应用程序。该脚本向 127.0.0.1 上的端口发送 GET 请求;以 2000 年为例。客户端读取消息,执行一些操作,然后将回复发送回服务器。

问题描述

这种类型的交互被认为是跨域资源共享。我已阅读材料here 并编写了我的程序以使用适当的 cors 标头消息响应请求。不幸的是,我似乎收到了错误消息:

XMLHttpRequest cannot load http://127.0.0.1:2000/?Command=test&Parameters=1234. Origin http://127.0.0.1 is not allowed by Access-Control-Allow-Origin.

完整的 Http 交换

GET /?Command=test&Parameters=1234 HTTP/1.1
Host: 127.0.0.1:2000
Connection: keep-alive
Origin: http://127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (Khtml, like Geco) Chrome/17.0.963.79 Safari/535.11
Accept: */*
Referer: http://127.0.0.1/test/main.php
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3


HTTP/1.1 200 OK
Server: Custom-Gnat-Client-v1.0
Access-Control-Allow-Origin: *
Origin: http://127.0.0.1
Content-Length: 12
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Content-Type: text/plain


Success

相关代码

在 main.js 中:

var Is_IE                = window.XDomainRequest ? true : false;
var Cross_Domain_xmlhttp = Create_Cross_Domain_Request();

function Create_Cross_Domain_Request()
  var request;
  if(Is_IE)
    request = new window.XDomainRequest();
  else
    if(window.XMLHttpRequest)
      request=new XMLHttpRequest();
     else 
      request=new ActiveXObject("Microsoft.XMLHTTP");
    
  
  return request;


...

var URL = "http://127.0.0.1:2000/"+"?Command="+Command_String+"&Parameters=" +Parameters;
if (Cross_Domain_xmlhttp)
  if(Is_IE)
    Cross_Domain_xmlhttp.onload=function()
      console.log(Cross_Domain_xmlhttp.responseText);
    
    Cross_Domain_xmlhttp.open("GET", URL, true);
    Cross_Domain_xmlhttp.send();
   else 
    Cross_Domain_xmlhttp.open('GET', URL, true);
    Cross_Domain_xmlhttp.onreadystatechange=function()
      if (Cross_Domain_xmlhttp.readyState==4 && Cross_Domain_xmlhttp.status==200)
        console.log(Cross_Domain_xmlhttp.responseText);
      
    
    Cross_Domain_xmlhttp.send();
  
 else 
  alert("The browser does not support XDomainRequest or XmlHttpRequest");

客户端代码目前不相关,但如果需要,我会发布。

【问题讨论】:

【参考方案1】:

服务器响应中不应有任何Origin: http://127.0.0.1,因为它是请求标头。

为什么不返回Access-Control-Allow-Origin: http://127.0.0.1 而不是*

【讨论】:

好吧,删除 Origin 并没有帮助。此外,将127.0.0.1 作为 Access-Control-Allow-Origin 也是理想的,但我现在有 * 那里,因为我希望它尽可能地宽容,直到我让它工作。然后我会缩小范围。 它也不起作用,我敢打赌它与响应的编码有关。用 Ada 编写的客户端具有默认的 Latin-1 字符串编码。经过一番阅读,他们似乎期望 utf-8 编码。 如果你只使用拉丁字符,编码不会有任何区别。 所以我进入了 chrome 和 IE 9 中的网络开发人员工具,并查看了标题/响应内容。 IE 9 收到了响应,但它无法呈现“成功”。 Chrome 根本没有收到任何响应标头... wtf? 这意味着它与 xmlhttprequest 与 xdomainrequest 有关

以上是关于Cors XmlHttpRequest 和响应的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5 CORS - XMLHttpRequest 无法加载 http://myapi.com。预检响应具有无效的 HTTP 状态代码 500

CORS 策略已阻止从源“localhost”访问“localhost”处的 XMLHttpRequest:对预检的响应 [关闭]

CORS 策略已阻止从源“null”访问 XMLHttpRequest:对预检请求的响应未通过访问控制 [重复]

CORS 策略已阻止对 XMLHttpRequest 的访问

CORS 策略已阻止从源对 X 的 XMLHttpRequest 的 CORS 访问

CORS - 带有“授权”的 Ajax 或 XMLHttpRequest 类型 GET 获取错误 307