¿Por qué estoy viendo un error de "Origen de control de acceso Access-Control-Aligin" aquí? [duplicar

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

Pregunta

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?

¿Fue útil?

Solución

JavaScript es limitado al hacer solicitudes AJAX fuera del dominio actual.

  • Ej. 1: Su dominio es Ejemplo.com y desea hacer una solicitud a Test.com => No puede.
  • Ej 2: Su dominio es Ejemplo.com y desea hacer una solicitud a Inner.example.com => No puede.
  • Ex 3: Su dominio es Ejemplo.com:80 y desea hacer una solicitud a Ejemplo.com:81 => No puede
  • Ej.

JavaScript está limitado por la "misma política de origen" por razones de seguridad para que un script malicioso no pueda contactar a un servidor remoto y enviar datos confidenciales.

JSONP es una forma diferente de usar JavaScript. Usted hace una solicitud y los resultados están encapsulados en una función de devolución de llamada que se ejecuta en el cliente. Es lo mismo que vincular una nueva etiqueta de script en la parte principal de su HTML (ya sabes que puedes cargar scripts de diferentes dominios que el tuyo aquí).
Sin embargo, para usar JSONP, el servidor debe configurarse correctamente. Si este no es el caso, no puede usar JSONP y debe confiar en un proxy del lado del servidor (PHP, ASP, etc.). Hay muchas guías relacionadas con este tema, ¡solo google!

Otros consejos

Xmlhttprequest no te dejará alcanzar localhost:8080 Debido a la "política de origen".

Puede permitir las solicitudes de los 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, ...).

Lea más sobre las solicitudes de AJAX de origen cruzado en https://developer.mozilla.org/en/http_access_control

Si está utilizando Chrome, una solución simple (solo para fines de desarrollo) es usar la opción --disable-web-security.

Agregue un global.asax en su solución.

Agregar

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

en

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

Si está usando Apache, esto funciona: coloque esto en/cree un archivo .htaccess en su raíz pública y agregue cualquier otra extensión de archivo que pueda necesitar.

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

Para el desarrollo local, puede usar una herramienta para modificar los encabezados de respuesta HTTP. Por ejemplo Charles es capaz de hacer esto mediante la herramienta de reescritura incluida: Reescritura

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

Aquí tenemos que hacer dos cosas para Apache HTTP

1) En el archivo httpd.config, descomnación 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 está usando Google Chrome como navegador, puede agregar la extensión CORS y activarla, resolverá el problema del agujero sin tener que cambiar nada en su código

No relacionado con esta pregunta en particular, pero para cualquier persona en esta situación usando jQuery ... este error también es causado si intenta hacer una solicitud de JSONP usando jQuery y omite el parámetro de devolución de llamada mágica: callback=?

Si es de un fondo de Java, una posible solución podría ser hacer un servlet que llame a los servicios web para su JavaScript. Algo 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 especifique la URL como el nombre del servlet!

Me encuentro con el mismo mensaje de error, cuando uso AJAX para acceder a una página PHP (el archivo JavaScript y PHP se encuentran en el mismo servidor).

La razón fue que especificé la dirección IP como el dominio en mi JavaScript. Esto hizo que el navegador creyera que la llamada al archivo PHP está en otro servidor.

Entonces, una solución fácil para eliminar este mensaje de error. a) Verificar JavaScript y el archivo PHP están en el mismo servidor b) Asegúrese de que la URL (en particular el dominio) en su JavaScript (por ejemplo http://www.smartana.co.uk/myjavascript.js) Ajax refleja la URL de su servidor (por ejemplo http://www.smartana.co.uk/myserver.php).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top