[Javascript] ¿Por qué veo un error de "origen no permitido por Access-Control-Allow-Origin" aquí?


Answers

XMLHttpRequest no le permitirá llegar a localhost:8080 debido a la "misma política de origen".

Puede permitir solicitudes de navegadores modernos agregando un encabezado a su respuesta en localhost:8080 :

Access-Control-Allow-Origin: *

Puede hacerlo agregando directivas a su servidor HTTP o agregando encabezados a través del código del lado del servidor (PHP, Ruby, ...).

Obtenga más información sobre las solicitudes de ajax de origen cruzado en https://developer.mozilla.org/en/http_access_control

Question

Esta pregunta ya tiene una respuesta aquí:

Estoy viendo el siguiente error:

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

con este código:

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);

¿Qué puede causar esto y cómo lo resuelvo?




Agregue un global.asax en su solución.

Añadir

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

en

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



Aquí, tenemos que hacer dos cosas para Apache Http

1) En el archivo httpd.config, descomenta este archivo

LoadModule headers_module modules/mod_headers.so

2) Agregue esta línea en la parte inferior.

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



Si eres de origen java, una posible solución podría ser crear un servlet que llame a los servicios web para tu javascript. algo así como el siguiente código en el método GET (Your-choice) ...

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();
    }
}

¡Ahora en javascript simplemente especifica el url como el nombre del servlet!




Para el desarrollo local, puede usar una herramienta para modificar los encabezados de respuesta HTTP. Por ejemplo, Charles puede hacer esto con la herramienta de reescritura incluida: Rewrite Tool

Simplemente agregue una nueva regla para el dominio / ubicación objetivo con:

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