Perché vedo un ' “origine non è consentita da Access-Control-Allow-Origin” Errore di qui? [duplicare]

StackOverflow https://stackoverflow.com/questions/9310112

Domanda

sto vedendo il seguente errore:

Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin

con questo codice:

var http = new getXMLHttpRequestObject();
var url = "http://gdata.youtube.com/action/GetUploadToken";
var sendXML = '<?xml version="1.0"?><entry xmlns="http://www.w3.org/2005/Atom"'+
    'xmlns:media="http://search.yahoo.com/mrss/'+
    'xmlns:yt="http://gdata.youtube.com/schemas/2007">'+
    '<media:group><media:title type="plain">My First API</media:title>'+
    '<media:description type="plain">First API</media:description>'+
    '<media:category scheme="http://gdata.youtube.com/schemas/2007/categories.cat">People</media:category>'+
    '<media:keywords>first, api</media:keywords></media:group></entry>';
http.open("POST", url, true);
http.setRequestHeader("Authorization", "AuthSub token=" + AccessToken);
http.setRequestHeader("X-GData-Key", "key="+ dev_key);
http.setRequestHeader("Content-Type", "application/atom+xml; charset=UTF-8");

http.onreadystatechange = function() {
    if(http.readyState == 4) {
        alert(http.responseXML);
    }
}
http.send(sendXML);

Che cosa può causare questo, e come posso risolverlo?

È stato utile?

Soluzione

JavaScript è limitata quando si effettuano richieste Ajax di fuori del dominio corrente.

  • Ex 1: il tuo dominio è example.com e si vuole fare una richiesta al test.com => non si può.
  • Es. 2: il tuo dominio è example.com e si vuole fare una richiesta al inner.example.com => non è possibile
  • Ex 3: il tuo dominio è example.com:80 e si vuole fare una richiesta al example.com:81 => Non puoi
  • EX 4: il tuo dominio è example.com e si vuole fare una richiesta al example.com => è possibile
  • .

JavaScript è limitata dalla "stessa politica di origine" per motivi di sicurezza in modo che uno script dannoso non riesce a contattare un server remoto e inviare dati sensibili.

jsonp è un modo diverso di utilizzare javascript. Si effettua una richiesta ed i risultati sono incapsulati in una funzione di callback che viene eseguito nel client. E 'lo stesso di collegamento di una nuova tag script nella parte di testa del codice HTML (si sa che è possibile caricare gli script da domini differenti rispetto i tuoi articoli qui).
Tuttavia, per utilizzare jsonp il server deve essere configurato correttamente. Se questo non è il caso non è possibile utilizzare jsonp e si deve fare affidamento su un proxy lato server (PHP, ASP, ecc). Ci sono un sacco di guide relativi a questo argomento, basta google!

Altri suggerimenti

XMLHttpRequest non vi permetterà di raggiungere localhost:8080 a causa della "stessa politica di origine".

È possibile consentire richieste dei browser moderni con l'aggiunta di un colpo di testa alla risposta in localhost:8080:

Access-Control-Allow-Origin: *

È possibile farlo aggiungendo direttive al server HTTP o l'aggiunta di intestazioni tramite codice lato server (PHP, Ruby, ...).

Per saperne di più sulle richieste Ajax Cross-Origin su https://developer.mozilla.org/en/http_access_control

Se si utilizza Chrome, una soluzione semplice (solo per scopi di sviluppo) è quello di utilizzare l'opzione --disable-web-security.

Aggiungi un global.asax nella soluzione.

Add

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

in

protected void Application_BeginRequest(object sender, EventArgs e)
{
}

Se la vostra utilizzando Apache, questo funziona: mettere questo in / creare un file .htaccess nella root pubblica, e aggiungere eventuali altre estensioni di file si potrebbe aver bisogno.

<FilesMatch "\.(ttf|otf|eot|woff|jpg|png|jpeg|gif|js|json|html|css)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

Per lo sviluppo locale è possibile utilizzare uno strumento per la modifica delle intestazioni di risposta HTTP. Per esempio Charles è in grado di farlo con lo strumento riscrittura incluso: Rewrite strumento

Basta aggiungere una nuova regola per il dominio di destinazione / posizione con:

Type: Add Header
Where: Response
Replace
     Name: Access-Control-Allow-Origin
     Value: *
Replace All

Qui, dobbiamo fare due cose per Apache Http

1) Nel file di httpd.config, togliere il commento file

LoadModule headers_module modules/mod_headers.so

2) Aggiungere questa riga in basso.

Header set Access-Control-Allow-Origin "*"

Se si sta utilizzando Google Chrome come browser è possibile aggiungere l'estensione CORS, e attivarlo, si risolverà il problema del foro, senza dover cambiare nulla nel codice

Estranei a questa particolare questione, ma per chiunque in questa situazione utilizzando jQuery ... Questo errore è causato anche se si tenta di effettuare una richiesta JSONP utilizzando jQuery e omette il parametro magia callback: callback=?

Se si da uno sfondo java una possibile soluzione potrebbe essere quella di fare una servlet che chiama i-servizi Web per il vostro javascript. qualcosa di simile al di sotto codice nella GET (La vostra scelta) metodo ...

JsonElement jelement;
    JsonArray jarray;
    try {
        URL url = new URL("http://rest."YOUR URL"#ba0482");
        URLConnection connection = url.openConnection();
        connection.setDoInput(true);
        InputStream inStream = connection.getInputStream();
        BufferedReader input = new BufferedReader(new InputStreamReader(inStream));

        jelement = new JsonParser().parse(input);

        jarray = jelement.getAsJsonArray();

        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.print(jarray);
        out.flush();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Ora, nel javascript semplicemente specificare l'URL come il nome servlet !!

mi imbatto nello stesso messaggio di errore, quando si utilizza Ajax per accedere a una pagina php (javascript e file php si trovano entrambi sullo stesso server).

La ragione era che ho specificato l'indirizzo IP come il dominio nel mio JavaScript. Ciò ha reso il browser credere che la chiamata al file php è su un altro server.

Quindi, una soluzione facile per sbarazzarsi fuori questo messaggio di errore. a) verificare javascript e file php sono sullo stesso server b) assicurarsi che l'URL (in particolare il dominio) nella tua JavaScript (ad esempio http: // www. smartana.co.uk/myJavaScript.js ) ajax rispecchia il vostro URL del server (ad esempio, http: //www.smartana.co.uk/myServer.php ).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top