Firefox设置允许跨域Ajax请求

47

我需要临时允许跨域XMLHttpRequest。更改Firefox安全设置似乎是可行的方法。但我已经尝试了这个这个,但它们都没有起作用。有人之前能够配置过此项吗?谢谢。


如果您需要更改Firefox安全设置,那么您可以使用GreaseMonkey脚本吗? - Sam Hasler
1
在Chrome上尝试一下:https://dev59.com/QnA75IYBdhLWcg3wy8Ui - AgA
请尝试我的Firefox插件,以启用跨域Ajax功能,链接在此:https://addons.mozilla.org/en-US/firefox/addon/cross-domain-cors/ - Tan Mai Van
11个回答

27

如果你在开发和测试应用程序时不想浪费时间处理跨域问题,你可以使用 Firefox 的插件 Force CORS

更新:似乎该插件已经不存在了。但是还有另一种选择 - 这个 Chrome 扩展程序


9
Forcecors 很棒。值得一提的是,安装后您需要点击“查看”=>“工具栏”=>“附加组件栏”。然后 cors 按钮将显示在右下角,请单击该按钮以启用它。我解压了 xpi 文件并查看了当按钮被按下时有一个切换功能,但从未看到过该按钮。 - HMR
5
值得一提的是,安装完成后需要点击“查看”=>“工具栏”=>“附加组件栏”。 - NcAdams
7
貌似FF已经删除了它。 - shashwat
此外,Google 将从 2024 年第一季度开始逐步淘汰第三方 Cookie:https://www.techcircle.in/2023/05/19/google-will-start-phasing-out-third-party-cookies-from-q1-2024 - Seyed Ali Mahmoody

22

对于现代浏览器,您可以尝试以下方法:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

简而言之,您需要将以下内容添加到 SERVER 响应头中(以下允许从foo.example 访问):

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
Access-Control-Max-Age: 1728000

请注意,X-PINGOTHER是由JavaScript插入的自定义标头,应该因站点而异。

如果您希望任何站点通过Ajax访问您的服务器,请使用*代替。


编辑:

当我在2009年首次回答这个问题时,我实际上遇到了同样的问题,并且我使用了服务器端配置来解决它。

那时FF或Chrome上没有插件。

但是,现在我们可以使用浏览器端插件的替代方法,请查看tsds的答案。


4
如果我理解正确,如果您无法更改服务器,则这并不能解决原始问题。 - Aras
1
请注意,如果您还想使用XHR的withCredentials选项发送cookie头,则Access-Control-Allow-Origin:*将无法工作。在这种情况下,您确实需要指定一个特定的域。 - dmkc
11
这并没有回答问题。原帖是关于浏览器端配置的。 - NeDark

9

你尝试使用jQuery的ajax请求了吗?从1.3版本开始,jQuery支持某些类型的跨域ajax请求。

引用上面的参考:

注意:当'dataType'为'script'或'jsonp'时(因为它使用DOM脚本标签加载脚本),所有远程(不在同一域)请求应指定为GET。这些请求不可用于需要XMLHttpRequest对象的Ajax选项。完成和成功函数在完成时调用,但不接收XHR对象;beforeSend和dataFilter函数不会被调用。

从jQuery 1.2开始,如果您指定JSONP回调,可以加载位于另一个域上的JSON数据,可以像这样完成:"myurl?callback=?"。 jQuery会自动替换'?'为正确的方法名来调用您指定的回调函数。或者,如果将'dataType'设置为"jsonp",则会自动添加回调到您的Ajax请求中。


我们正在使用这个来检索JSON数据,但这是HTML,它被合并到页面中,而且只是暂时的,所以更改Firefox配置应该是最简单的事情。 - Pablote
2
为什么要踩?使用框架的跨域能力是对这个问题的合理回应。问题中没有提到需要HTML,只是在评论中提到了它。 - tvanfosson

7

事实上,没有办法“暂时”禁用跨域XMLHttpRequest。如果您可以暂时禁用它,那么它就可以被永久禁用。这是现代AJAX编程中一个相当常见的问题,并且通常使用称为跨域脚本编写技术来解决。

这里的想法是,如果您调用跨域脚本,则返回JavaScript(JSON)结果,然后将其传递给您端上的函数。

以下是一些示例代码,以说明从JavaScript代码角度看它可能是什么样子:

  function request_some_data() {
    var s = "http://my.document.url.com/my_data?p1=v1&p2=v2&callback=myfunc";

      try {
        try{
          document.write("<scr"+"ipt type='text/javascript' src='"+s+"'></scr"+"ipt>");
        } 
        catch(e){
          var x = document.createElement("script");
          x.src = s;
          document.getElementsByTagName("head")[0].appendChild(x);
        }
      }
      catch (e) {
        alert(e.message);
      }
   }

然后在您的代码中定义一个接收数据的函数,在服务器端“处理”回调情况,以下是客户端JavaScript代码:

function myfunc(data) {
  alert(data);
}

在服务器端,这里我举了一个PHP的例子,但是在Java或者其他你使用的服务器端技术中同样容易实现:

<?php
   if($_GET["callback"]) {
     print($_GET["callback"] . "(");
   }
   /* place your JSON object code/logic here */
   if($_GET["callback"]) {
     print(");");
   }
 ?>

请注意,您在服务器端生成的内容最终会成为一些JavaScript代码,在客户端执行。

16
“<scr”+“ipt”看起来非常恶意。” - Free Consulting
4
当然可以暂时禁用它。例如,使用参数 --disable-web-security 启动 Chrome。 - Joseph Lust
@JosephLust请注意,这是在Chrome广泛使用之前提出/回答的。 - Michael

2
我从file://遇到了这个问题。我想从一个本地HTML文件(一个测试平台)向两个服务器发送查询。
这种情况不应该有任何安全问题,但只有Safari允许这样做。
这里是我发现的最好的讨论此问题的文章

谢谢!我猜我不会再在Chrome中进行测试了。 - tomdemuyt

2
我也曾尝试使用“UniversalBrowswerRead”,但它并没有起作用。你可能可以添加一个“allow”头,但我还没有尝试过。这是相当新的技术。
你可以在这里找到更多信息。

1

允许跨域:

  1. 输入about:config
  2. 接受警告
  3. 在搜索栏中输入security.fileuri.strict_origin_policy
  4. 将其改为false

现在可以关闭标签页。通常情况下,使用此配置可以进行跨域请求。

有关更多详细信息,请参见此处


1
使用类似于 mod_proxy 的东西怎么样? 这样你的浏览器就会认为请求发往同一台服务器, 但实际上它们是被转发到另一台服务器。

1

我使用Fiddler作为代理。Fiddler将本地主机调用重定向到外部服务器。

我配置了Firefox使用手动代理(127.0.0.1端口8888)。Fiddler通过使用URL过滤器捕获调用并将其重定向到另一个服务器。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接