如何修复Firefox中的跨源请求失败

时间:2015-10-14 07:12:58

标签: javascript json .htaccess firefox

我有一个javascript文件,我想将json数据发送到ERP系统:

 var formData1 = JSON.stringify($('#msform').serializeObject());
    $.ajax({
        url:'http://102.101.101.11:80/cops.nsf/orders?openagent',
        type:'POST',
        data:formData1,
        crossDomain: true,
        dataType: 'json',
        jsonpCallback: 'callback',
        success: function(data) {
            //window.location.href = "http://www.petlooza.com";
            console.log(data);
        }
    });

此脚本适用于chrome和IE,,但FIREFOX给了我这个错误:

  

阻止跨源请求:同源策略禁止读取URL上的远程资源。原因:Cors-request失败。

如何解决这个问题? 请参阅下面的解决方案!

3 个答案:

答案 0 :(得分:1)

我建议查看以下资源:

Firefox CORS request giving 'Cross-Origin Request Blocked' despite headers这是一个很久以前的StackOverflow问题。

https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy可能会帮助您调试问题,它演示了Mozilla如何在CORS上实施自己的安全策略。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS是关于Mozilla CORS实现的深度服务器端文档。

可能是您通过不同的协议或主机请求它,我们无法从您的示例中获知,但这是常见的故障模式。

答案 1 :(得分:1)

我通过执行以下操作修复了它:

一个。您需要在运行脚本的主机上使用.htaccess。

<FilesMatch "\.(php)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "POST, GET, OPTIONS"
Header set Access-Control-Max-Age "1000"
Header set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"

其次,ERP系统还需要设置标题。如果标题设置正确,您可以使用curl进行检查。

B中。另一个选择:如果您不想使用标题,或者无法设置某些标题,那么您可以使用CURL来完成这项工作:

在我的表单上单击提交时,我的脚本将调用.php文件,其中包含此代码:

<?php
//
//code to send json to lotus webservice without cors errors
//
$jsondata = $_GET['jsondata'];
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"102.101.101.11:80/cops.nsf/orders?openagent");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$jsondata);

// in real life you should use something like:
// curl_setopt($ch, CURLOPT_POSTFIELDS,
//          http_build_query(array('postvar1' => 'value1')));

// receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec ($ch);


curl_close ($ch);



?>

它有效!没有更多的cors错误!和数据发送到服务器,也由服务器接收:)

答案 2 :(得分:0)

如果您可以控制另一方的代码,则可以使用JSONP来获取数据,并且可以避免CORS的所有问题。

更新:我前几天在博客中谈到了JSONP:http://blog.texasswede.com/calling-a-notes-web-agent-from-another-server-using-jsonp/