【问题标题】:Error No 'Access-Control-Allow-Origin' header is present on the requested resource错误请求的资源上不存在“Access-Control-Allow-Origin”标头
【发布时间】:2015-07-29 22:51:50
【问题描述】:

我正在尝试使用 XMLHttpRequest 在远程机器上进行生物特征认证。但它返回以下消息:

XMLHttpRequest 无法加载 http://177.55.99.146:8080/autenticacao/autentica?arquivo=[object%20File]。请求的资源上不存在“Access-Control-Allow-Origin”标头。 Origin 'http://www.yaratecnologia.com.br' 因此不允许访问

代码如下...。有谁知道错误在哪里?我该怎么办?

<?php
    // Allow from any origin
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
            header("Access-Control-Allow-Headers:        {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

        exit(o);
    }

    echo "You have CORS!";
?>

<script type="text/javascript">  
    function autenticarbiometria() { 
       var fileInput = document.getElementById('fileInput');
       var file = fileInput.files[0];
       var reader = new FileReader();
       var campo = "";
       var status = "f";;

       if (file.size != 400) {
          alert("ATENÇÃO --> O arquivo selecionado NÃO está em um formato Biométrico válido!");
          return false;
       }

       if (!confirm("CONFIRMA AUTENTICAÇÃO BIOMÉTRICA NA BASE DE DADOS?")) {
          return false;
       }

       if(window.XMLHttpRequest) {
          req = new XMLHttpRequest();
          }
       else if(window.ActiveXObject) {
          req = new ActiveXObject("Microsoft.XMLHTTP");
          }

       // Arquivo PHP juntamente com o valor digitado no campo (metodo GET)
       var url = "http://177.55.99.146:8080/autenticacao/autentica?arquivo="+file;

       // Chamada do metodo open para processar a requisicao

       req.open("GET",url,true);
       req.send(null); 

       // Quando o objeto recebe o retorno, chamamos a seguinte funcao
       req.onreadystatechange = function() {
         alert("Retorno do readyState == " + req.readyState + " readyStatus == " + req.status);
         if(req.readyState == 4 && req.status == 200) {
             // Resposta retornada pelo busca.php
             var resposta = req.responseText;
             alert("ATENÇÃO --> RETORNO AUTENTICACAO = " + resposta);
          }  
        }
  }
</script>

【问题讨论】:

  • javascript 代码在哪里运行 - 是在 yaratecnologia.com.br 上吗?
  • 没有。 javascript 正在另一台服务器上运行

标签: javascript cross-domain xmlhttprequest-states


【解决方案1】:

您的 sn-p 有点混乱。如果整个代码属于同一页面,则似乎您已在本地计算机上启用了 CORS,而必须在您进行身份验证的远程服务器上设置 Access-Control-Allow-Origin

您应该通过设置正确的Access-Control-Allow-Origin 标头来更改远程服务器上的代码,或者,如果这不可能,您应该从 PHP(服务器端)执行身份验证。

【讨论】:

  • 我的 javascript 在 Web 服务器上运行,而 yaratecnologia.com.br 在另一台机器上。但是我怎样才能允许远程机器中的访问呢?
  • 如果远程服务器未设置 CORS 标头,则无法从浏览器发出 ajax 请求。您应该能够使用 PHP 而不是 javascript 将 GET 转换为 http://177.55.99.146:8080/autenticacao/autentica
  • Mhmm... 您的 sn-p 清楚地从 javascript 执行 XMLHttpRequest() (您可以看到它在 &lt;script type="text/javascript"&gt; 标记内)。您需要在&lt;?php ... ?&gt; 标记内编写代码。也许this doc 可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 2016-11-25
  • 2015-04-04
  • 1970-01-01
  • 2020-11-08
  • 2013-11-29
  • 2014-07-28
相关资源
最近更新 更多