Para solucionarlo tenemos que usar la técnica JSONP (JSON con padding) para poder realizar llamadas asíncronas a dominios diferentes.
Si usáis los métodos de jQuery $.getJSON o $.ajax para solucionarlo basta con añadir al final de la URL a la que queremos hacer una petición el parámetro "callback=?", por ejemplo:
El tema es que los browser bloquean acceso a otros dominios por temas de seguridad, eso se ve en que un XMLHttpRequest (peticion AJAX como las que hace jQuery en getJSON, etc) dará un error si la url no es la del mismo host. (Los que hayan trabajado con flash conoceran el crossdomain.xml que es parecido)
Esto se solucionó hace unos años con un comando en las cabeceras del request y el response, que tanto cliente como servidor deben incluir. Si dicho comando no está en el header del request la petición no se envia, si está se envia pero si el server no responde con el comando en el header, entonces el browser no te pasa los datos a Javascript.
Activarlo es facil, info aquí: http://enable-cors.org/
Antes de que existiera el CORS se usaba un hack que todavia funciona: cuando queremos hacer un getJSON a otro dominio lo que hacemos realmente es incluir en el DOM un script donde la url es la petición que quieres hacer. A nivel de seguridad el estandar permite hacerlo (todos hemos incluido jQuery directamente de la web oficial alguna vez), el problema es como leer los datos recibidos ya que incluir un JSON en el DOM tal cual no tiene ningun efecto (es como poner en mitad del codigo {a:1};).
Por eso la petición debe devolver algo como:
window.variable_nombre_raro = { /* CODIGO JSON */ };
De esta manera si luego se busca en el scope global (window) la variable rara podemos leer los datos. Todo esto jQuery lo automatiza pero para que funcione es necesario que jQuery sepa el nombre de la variable, por eso en el request le envia el nombre que tendrá que tener la variable. No recuerdo exactamente qué parametro era pero es facil de averiguar.
Obviametne esto solo funciona si el server entiende que es una peticion JSONP y responde adecuadamente poniendo el nombre de la variable, sino es imposible (a no ser que te montes un proxy por medio en tu host)
estoy recorriendo foros habidos y por haber, hace 3 dias que tengo este problema (voy a tener que ir al psicologo), estoy haciendo una aplicaciond e mapas con openlayers y jquery y en este punto tan clarito (trabaje con ajax, xajax, desde que recien se empezo a ver la posibilidad de la comunicacion asincronica). y he de decirte que tu informacion fue lo mas util que encotnre, ya que trate de filtrar el cors en geoserver o tomcat como quieras llamarlo y realmente nada dio resultado, me imaginaba que habia que poner algo en el encabezado de la llamada, lo extraño ahora es que me tira otro error (un error que me lo tiraba cuando a la pagina lo ponia dentro del espacio web del tomcat, es decir en el servidor local (la aplicacion la estoy haciendo para ponerla en un server apache y hacer una comunicacion entre servidores)). bueno lo cierto es que ahora me tira otro error, no de cabecera cors, sino el que sigue :
SyntaxError: expected expression, got '
Si usáis los métodos de jQuery $.getJSON o $.ajax para solucionarlo basta con añadir al final de la URL a la que queremos hacer una petición el parámetro "callback=?", por ejemplo:
http://urls.api.twitter.com/1/urls/count.json?url=http%3A%2F%2Fgoogle.com&callback=?
Con este pequeño truco ya no nos tendría que dar el error Access-Control-Allow-Origin.
27/02/2014 13:19
Esto se solucionó hace unos años con un comando en las cabeceras del request y el response, que tanto cliente como servidor deben incluir. Si dicho comando no está en el header del request la petición no se envia, si está se envia pero si el server no responde con el comando en el header, entonces el browser no te pasa los datos a Javascript.
Activarlo es facil, info aquí: http://enable-cors.org/
Antes de que existiera el CORS se usaba un hack que todavia funciona: cuando queremos hacer un getJSON a otro dominio lo que hacemos realmente es incluir en el DOM un script donde la url es la petición que quieres hacer. A nivel de seguridad el estandar permite hacerlo (todos hemos incluido jQuery directamente de la web oficial alguna vez), el problema es como leer los datos recibidos ya que incluir un JSON en el DOM tal cual no tiene ningun efecto (es como poner en mitad del codigo {a:1};).
Por eso la petición debe devolver algo como:
window.variable_nombre_raro = { /* CODIGO JSON */ };
De esta manera si luego se busca en el scope global (window) la variable rara podemos leer los datos. Todo esto jQuery lo automatiza pero para que funcione es necesario que jQuery sepa el nombre de la variable, por eso en el request le envia el nombre que tendrá que tener la variable. No recuerdo exactamente qué parametro era pero es facil de averiguar.
Obviametne esto solo funciona si el server entiende que es una peticion JSONP y responde adecuadamente poniendo el nombre de la variable, sino es imposible (a no ser que te montes un proxy por medio en tu host)
Suerte
27/02/2014 12:12
16/02/2016 05:45
SyntaxError: expected expression, got '