[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?




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



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!




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 "*"



Links