javascript - Solicitudes AJAX entre sitios
security xss (8)
El hecho de que esto funcione en IE es un problema de seguridad con IE, no una función.
Lamentablemente, la creación de scripts entre sitios está prohibida, y el trabajo aceptado consiste en proxy las solicitudes a través de su propio dominio: ¿realmente no tiene la capacidad de agregar o modificar el código del lado del servidor?
Además, la solución alternativa secundaria (que implica la adquisición de datos mediante etiquetas de secuencia de comandos) solo admitirá solicitudes GET, que es posible que pueda piratear con un servicio SOAP, pero no tanto con la solicitud POST a un servicio RESTful que usted describa.
Realmente no estoy seguro de que exista una solución AJAX, es posible que haya vuelto a una solución <form>.
Necesito hacer una solicitud AJAX desde un sitio web a un servicio web REST alojado en otro dominio.
Aunque esto funciona muy bien en Internet Explorer, otros navegadores como Mozilla y Google Chrome imponen restricciones de seguridad mucho más estrictas, que prohíben las solicitudes AJAX entre sitios.
El problema es que no tengo control sobre el dominio ni sobre el servidor web donde está alojado el sitio. Esto significa que mi servicio web REST debe ejecutarse en otro lugar, y no puedo implementar ningún mecanismo de redirección.
Aquí está el código de JavaScript que realiza la llamada asincrónica:
var serviceUrl = "http://myservicedomain";
var payload = "<myRequest><content>Some content</content></myRequest>";
var request = new XMLHttpRequest();
request.open("POST", serviceUrl, true); // <-- This fails in Mozilla Firefox amongst other browsers
request.setRequestHeader("Content-type", "text/xml");
request.send(payload);
¿Cómo puedo tener este trabajo en otros navegadores al lado de Internet Explorer?
Esto también se puede hacer utilizando localmente una configuración de servidor web que invoca curl con los argumentos correctos y devuelve la salida curl.
app.rb
require ''sinatra''
require ''curb''
set :views,lambda {"views/"+self.name.to_s.downcase.sub("controller","")}
set :haml, :layout => :''../layout'', :format => :html5, :escape_html=>true
disable :raise_errors
get ''/data/:brand'' do
data_link = "https://externalsite.com/#{params[:brand]}"
c = Curl::Easy.perform(data_link)
c.body_str
end
Enviar una solicitud ajax a localhost: 4567 / data / something devolverá el resultado de externalsite.com/something.
Haga que su dominio de servicio acepte compartir recursos de origen cruzado (CORS).
Escenario típico: la mayoría de los navegadores compatibles con CORS enviarán primero un encabezado OPTIONS, al cual el servidor debe devolver información sobre qué encabezados se aceptan. Si los encabezados satisfacen los requisitos del servicio para la solicitud proporcionada (métodos permitidos son GET y POST, Allowed-Origin *, etc.), el navegador reenviará la solicitud con el método apropiado (GET, POST, etc.).
Todo este punto hacia delante es el mismo que cuando usa IE, o más simplemente, si estaba publicando en el mismo dominio.
Caviots: algunos SDK de desarrollo de servicios (WCF en particular) intentarán procesar la solicitud, en cuyo caso deberá preprocesar el método OPTIONS para responder a la solicitud y evitar que se llame al método dos veces en el servidor.
En resumen, el problema se encuentra en el lado del servidor.
Editar Hay un problema con IE 9 y abajo con CORS, ya que no está completamente implementado. Afortunadamente, puede resolver este problema haciendo sus llamadas desde el código del servidor al servicio y hacer que vuelva a través de su servidor (por ejemplo, mypage.aspx? Service = blah & method = blahblah & p0 = firstParam = something). A partir de aquí, su código del lado del servidor debería implementar un modelo de secuencia de solicitud / respuesta.
La publicación marcada como la respuesta es errónea: el documento de iframes NO puede acceder al padre. La misma política de origen funciona en ambos sentidos.
El hecho es que no es posible de ninguna manera consumir un servicio web basado en el resto usando xmlhttprequest. La única manera de cargar datos desde un dominio diferente (sin ningún marco) es usar JSONP. Cualquier otra solución requiere un proxy en el servidor ubicado en su propio dominio, o un proxy del lado del cliente ubicado en el dominio remoto y algún tipo de comunicación entre sitios (como easyXDM ) para comunicarse entre los documentos.
La solución no muy clara (pero funciona) es usar iframe como contenedor para solicitudes a otros sitios. El problema es que el padre no puede acceder al contenido de iframe, solo puede navegar el atributo "src" de iframe. Pero el contenido del iframe puede acceder al contenido de los padres.
Por lo tanto, si el contenido del iframe lo sabe, pueden llamar a algún contenido de JavaScript en la página principal o directamente acceder al DOM de los padres.
EDITAR: Muestra:
function ajaxWorkaroung() {
var frm = gewtElementById("myIFrame")
frm.src = "http://some_other_domain"
}
function ajaxCallback(parameter){
// this function will be called from myIFrame''s content
}
Otra opción sería configurar un registro CNAME en su propio dominio para "enmascarar" el nombre de host del dominio remoto.
Solo use un proxy del lado del servidor en su dominio de origen. Aquí hay un ejemplo: http://jquery-howto.blogspot.com/2009/04/cross-domain-ajax-querying-with-jquery.html