Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 通过修改HTTP头在没有CORS的情况下使用XMLHttpRequest?_Javascript_Ajax_Http Headers_Cross Domain_Cors - Fatal编程技术网

Javascript 通过修改HTTP头在没有CORS的情况下使用XMLHttpRequest?

Javascript 通过修改HTTP头在没有CORS的情况下使用XMLHttpRequest?,javascript,ajax,http-headers,cross-domain,cors,Javascript,Ajax,Http Headers,Cross Domain,Cors,我正在使用(不推荐使用的)Twitter API 1.0进行一些测试 例如,我想从API获取数据,客户端使用AJAX浏览器请求从任何跨源网页获取数据。它可以是新的空白选项卡、本地HTML页面或任何现有网站 我尝试过JSONP,它工作得很好,但是我想使用默认的XMLHttpRequest,即使Twitter服务器不支持CORS 例如,在google.com主页上,我创建了一个对Twitter API的简单AJAX调用,该调用由Firebug执行: var xhr = new XMLHttpRequ

我正在使用(不推荐使用的)Twitter API 1.0进行一些测试

例如,我想从API获取数据,客户端使用AJAX浏览器请求从任何跨源网页获取数据。它可以是新的空白选项卡、本地HTML页面或任何现有网站

我尝试过JSONP,它工作得很好,但是我想使用默认的XMLHttpRequest,即使Twitter服务器不支持CORS

例如,在google.com主页上,我创建了一个对Twitter API的简单AJAX调用,该调用由Firebug执行:

var xhr = new XMLHttpRequest();
xhr.open("GET", "https://api.twitter.com/1/friends/ids.json?screen_name=baptx", false);
xhr.send();
由于同源策略,这将不起作用并在Firebug上打印错误:

Error: Failure
xhr.send();
它返回一个HTTP200OK代码,但没有从服务器接收到JSON数据

我已经看到了来自google.com网页和api.twitter网页(谁为twitter api请求工作,因为它是api域名,来源相同)的请求之间的两个区别

已使用当前域名添加了源HTTP标头:

Origin  https://www.google.com
Referer HTTP头与api.twitter.com页面的请求不同,但在我的例子中:

Referer https://www.google.com/webhp?hl=en
这就是为什么我试图删除源HTTP头并将当前的Referer HTTP头修改为

我已经使用Firefox ModifyHeaders扩展完成了这项工作,它可以工作,我可以在Firebug“Net”选项卡中检查这些更改是否正确

现在,我有来自google.com网页和api.twitter.com网页的相同请求头。 它仍然无法执行来自API以外的另一个域的AJAX请求,即使HTTP头被覆盖,为什么


顺便问一下,您知道为什么Firefox“New Tab”对Twitter API的AJAX请求会起作用吗?

如果web服务器不允许跨源资源共享,我们必须手动添加HTTP响应头访问控制允许源:*

我以为问题出在请求头上。没有用于修改HTTP响应头的Firefox插件,ModifyHeaders或TamperData仅支持请求头:

我的问题实际上与此类似:


解决方案:有人开发了Firefox插件来强制CORS:。或者我们可以在GreaseMonkey脚本中使用GM_xmlhttpRequest,它将绕过xmlhttpRequest的同源策略。在Chrome中,由于浏览器不提供API,因此没有像您希望的那样修改HTTP请求/响应头的插件,但有一个禁用SOP的标志(--disable web security)

服务器不需要遵守SOP,但浏览器需要遵守。即使您发送不同的头,您的浏览器也知道这是一个跨域请求。@Bergi很高兴知道,所以问题可能来自浏览器。。。Firefox是开源的,如果它不是跨域请求,它的行为难道不可能吗?我是否应该更改响应HTTP头而不是请求头?是的,您可以尝试一下(我不知道扩展名)。也许还有一个隐藏的配置标志可以完全禁用SOP。@Bergi谢谢你的想法,事实上有办法禁用SOP,但不是通过我在感谢你详细说明可能的解决方法时使用的插件。在Chrome中,至少有一种方法可以通过POSTMAN实现,但我不确定来自该扩展的请求是如何绕过Chrome的标题要求的。@ray Chrome扩展不受cors的影响