Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

O que é "Access-Control-Allow-Origin" e como eu me livro disso?

Estou tentando receber um arquivo .json que eu coloquei em um servidor através do XMLHttpRequest mas sempre que eu tento recebo:

Failed to load http://sitequeeuquerobaixar/data/data.json: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

O código que eu usei foi:

<!DOCTYPE html>
<html>
    <head>
        <title>Recebedor de dados</title>
        <meta charset="utf-8">
    </head>
    <body>
        <script>
            var xhr = new XMLHttpRequest();
            xhr.open("GET","http://sitequeeuquerobaixar/data/data.json");
            xhr.send();
            document.querySelector("body").textContent = xhr.resposeText;
        </script>
    </body>
</html>

E o arquivo está disponível pois eu posso acessa-lo no meu navegador, o que eu faço para acessar esse arquivo com javascript?

7 respostas
solução!

Olá, Wilton!

Você caiu no Same Origin Policy: é uma limitação do navegador que impede que um site chame o outro por AJAX. É uma política de segurança do navegador.

Se o servidor definir o cabeçalho Access-Control-Allow-Origin com o seu site (ou *), a chamada AJAX é feita.

Veja mais detalhes nessa aula: https://cursos.alura.com.br/course/jquery-a-biblioteca-do-mercado-parte-2/task/21254

Olá Alexandre,

Se eu montar um mini-navegador que ignora a politica CORS, eu conseguiria fazer requisições de domínios diferentes?

Algo mais voltado para uso pessoal no caso.

Wilton,

É isso mesmo! Mas montar um navegador não é algo lá tão fácil.

Você pode fazer um servidor chamar o outro servidor. Entre servidores não há essa restrição.

Aliás, para aplicações Desktop ou Linha de Comando não há a restrição também!

Olá Alexandre,

Desculpa te incomodar de novo, mas no video que você me enviou o instrutor fala que a política de CORS foi implementada justamente para impedir que um servidor dê uma de "intemediador" entre um cliente e o servidor verdadeiro, então como requisições entre servidores seriam possíveis?

Opa, Wilton!

A Same Origin Policy só vale de um navegador para um servidor. Entre servidores não há essa restrição.

Inclusive, fiz um teste aqui e o navegador impediu a chamada enquanto uma aplicação de linha de comando chamou normalmente.

O CORS é uma solução focada no navegador. O navegador que implementa as checagens. Você pode até implementar alguma checagem do lado do servidor mas usando bibliotecas como a "cors" do NodeJS, a única coisa que é feita é inserir cabeçalhos do lado do servidor.

Para impedir chamadas indesejadas de um servidor pra outro, acho que você precisa lidar com Redes.

Eu acho que esse trecho da explicação está incorreto!

Olá Alexandre,

Acho que finalmente matei a charada, não é que o servidor não possa fazer as requisições mas sim o site que ele enviou não pode.

O que faria isso não ser possível:


Servidor 1

    Envia:

Site 1

    Para o:

Navegador

E...............

Navegador

    Através do:

Site 1

    Recebe de:

Sevidor 2

Mas por outro lado permite que seja feito dessa maneira:

Servidor 1

    Envia:

Site 1

    Para o:

Navegador

E...............

Servidor 1

    Recebe de:

Servidor 2

E...............

Servidor 1

    Envia a resposta do Servidor 2 para:

Site 1

    Mostra o que foi recebido no:

Navegador

Acertei? Deste modo funcionou aqui. =)

Perfeito! Isso mesmo!