2010-08-05 7 views
5

Tengo algunos problemas con Cross Origin Resource Sharing and Prototype. Tengo una solicitud simple a un recurso externo, y para una simple solicitud posterior hay algunas reglas que deben cumplirse:Intercambio de recursos cruzados de origen con PrototypeJS

el tipo de contenido debe estar en la aplicación/x-www-form-urlencoded, multipart/form-data, o text/plain, una solicitud simple no establece encabezados personalizados con la solicitud http, y el servidor debe establecer el encabezado Access-Control-Allow-Origin correcto.

con una vainilla JavaScript XMLHttpRequest todo funciona bien, pero con PrototypeJS no funcionará porque borda Prototype establece algunos encabezados personalizados y no sé cómo evitarlo.

Lo he probado en Prototype a través de:

new Ajax.Request('some.foreign-host.com/res.php', { 
    method: 'post', 
    postBody: 'foo=bar', 
    contentType: 'application/x-www-form-urlencoded', 
    onSuccess: function(e){ 
    // some custom code 
    } 
}); 

Cualquier idea de cómo llegar Prototipo para enviar un simple solicitud de este tipo CORS?


Tengo un volcado de las cabeceras creadas por una llanura JavaScript XMLHttpRequest:

POST /bthesis/returnJSON.php HTTP/1.1  
Host: foreign-host.com       
Connection: keep-alive     
Referer: this-host.com 
Content-Length: 9       
Origin: this-host.com  
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Accept: */*        
User-Agent: [...] 
Accept-Encoding: gzip,deflate,sdch  
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

y los encabezados creados por una Solicitud Prototipo:

OPTIONS /bthesis/returnJSON.php HTTP/1.1 
Host: foreign-host.com       
Connection: keep-alive     
Referer: this-host.com 
Access-Control-Request-Method: POST  
Origin: this-host.com  
Access-Control-Request-Headers: X-Prototype-Version, X-Requested-With, Content-type, Accept 
Accept: */*        
User-Agent: [...] 
Accept-Encoding: gzip,deflate,sdch  
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

usos del prototipo un conjunto de encabezado totalmente diferente ... que conduce a un error de seguimiento en la consola:

XMLHttpRequest no puede cargar foreign-host.com/bthesis/returnJSON.php. Campo de encabezado de solicitud X-Prototype-Version no está permitido por Access-Control-Allow-Headers. Rehusó obtener el encabezado inseguro "X-JSON"

Lo extraño es que el servidor web devuelve en ambos casos el recurso solicitado (lo veo en la vista de 'Recursos' de la consola del desarrollador en cromo) pero confunde ese prototipo no tiene acceso a ella de alguna manera

Respuesta

0

Tal vez usted puede establecer el encabezado de origen a sí mismo en la solicitud Ajax, al igual que

new Ajax.Request('some.foreign-host.com/res.php', { 
    method: 'post', 
    postBody: 'foo=bar', 
    requestHeaders: {Origin: 'http://www.my.local-host.com'} 
    contentType: 'application/x-www-form-urlencoded', 
    onSuccess: function(e){ 
     // some custom code 
    } 
}); 

Nunca probado a mí mismo, aunque ... ¿Qué ocurre con la versión prototipo? ¿Se está emitiendo una solicitud y luego nada regresa, o se descarta una respuesta, o qué?

1

Por favor, echar un vistazo a PREFLIGHT aquí https://developer.mozilla.org/En/HTTP_access_control

Su problema es que Fx está reaccionando a las cabeceras personalizadas (X -...) y se activará la verificación previa. Tendrá que hacer que el servidor devuelva todos los encabezados de control de acceso para OPCIONES y POST y que permita encabezados personalizados.

11

Estoy teniendo el mismo problema.El @mplungjan enlace compartido contiene la respuesta:

Usted simplemente tiene que dejar que el navegador sabe que la cabecera x-json es segura mediante el uso de la access-control-expose-headers

estoy usando esta línea en Ruby on Rails controlador

headers['Access-Control-Expose-Headers'] = 'x-json' 

(esto debería ser bastante fácil de traducir a otros lenguajes de programación :))

Más detalles sobre este page

+1

Esto funcionó para mí. Gracias – FosAvance

1

Encontré solución en other SO question. Y funciona para mí: details are here.

En resumen - que necesita onCreate evento en su Ajax.Request que elimina las cabeceras no estándar:

onCreate: function(response) { // here comes the fix 
     var t = response.transport; 
     t.setRequestHeader = t.setRequestHeader.wrap(function(original, k, v) { 
      if (/^(accept|accept-language|content-language)$/i.test(k)) 
       return original(k, v); 
      if (/^content-type$/i.test(k) && 
       /^(application\/x-www-form-urlencoded|multipart\/form-data|text\/plain)(;.+)?$/i.test(v)) 
       return original(k, v); 
      return; 
     }); 
    } 
Cuestiones relacionadas