2012-09-07 11 views
40

Tengo un problema con el envío de solicitud de cuerpo AJAX utilizando jQuery CORS con tipo de contenido personalizado. Aquí está mi código:jQuery CORS OPCIONES de contenido

$.ajax({ 
    url: "http://some-other-domain/my-path", 
    type: "POST", 
    contentType: "application/json", 
    dataType: "json", 
    data: JSON.stringify({ 
    key: 1, 
    key2: 2 
    }), 
    statusCode: { 
    200: function(data) { 
    } 
    }, 
    xhrFields: { 
    withCredentials: true 
    }, 
    crossDomain: true 
}); 

necesito fijar el tipo de contenido como "application/json" ya que es requerir lado del servidor. Pero en lugar de enviar la solicitud como POST jQuery lo envía como OPCIONES.

Aquí hay una encabezados:

encabezados de respuesta:

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Pragma: No-cache 
Cache-Control: no-cache 
Expires: Thu, 01 Jan 1970 03:00:00 EET 
Set-Cookie: JSESSIONID=BB9D6783E58FB0F2ADE1924A2F0CBA52; Path=/ 
Content-Type: text/html;charset=UTF-8 
Content-Length: 6233 
Date: Fri, 07 Sep 2012 14:41:13 GMT 

Solicitar encabezados:

OPTIONS /my-path HTTP/1.1 
Host: MY-HOME-NAME 
User-Agent: MY_USER_AGEMT 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 
Origin: HERE-GOES-DOMAIN 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: content-type 
Pragma: no-cache 
Cache-Control: no-cache 

CORS funciona muy bien, todos los encabezados requeridos se envía por el servidor, pero no si se envía por OPCIONES tipo. ¿Es un problema de jQuery?

jQuery - 1.8.1

Respuesta

110

Esta solicitud OPCIONES es la solicitud de verificación previa CORS. Es una solicitud que se envía al servidor antes de la solicitud real para solicitar permisos para realizar la solicitud. El tipo de contenido personalizado de hecho está activando la verificación previa. De acuerdo con la especificación CORS (http://www.w3.org/TR/cors/), cualquier tipo de contenido otro que application/x-www-form-urlencoded, multipart/form-data o text/plain activa la comprobación previa.

Si no tiene control sobre el servidor remoto, deberá pedirles que respalden la verificación previa de CORS o probar con alguna otra opción, como JSON-P.

Si tiene control sobre el servidor remoto, puede cambiarlo para controlar las previsualizaciones. Con el fin de gestionar una petición de verificación previa, que debe enviar los siguientes encabezados en la respuesta a la solicitud OPCIONES:

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: POST 
Access-Control-Allow-Headers: Content-Type 

La respuesta debe ser un HTTP 200. La cabecera Access-Control-Allow-Methods respuesta de cualquiera de ellos puede eco del valor de la Access-Control-Request-Method, o simplemente puede ser GET, POST, PUT, DELETE para admitir todos los métodos. El encabezado de respuesta Access-Control-Allow-Headers debe hacer eco de los valores en el encabezado de solicitud Access-Control-Request-Headers.

Una vez que el navegador recibe esos encabezados, hará la solicitud real. Usted puede aprender más acerca de las solicitudes preliminares CORS aquí:

http://www.html5rocks.com/en/tutorials/cors/

+3

usted. Son. A. Godsend. El tema Permitir encabezados es lo que me atrapó. Pero más que el código que publicaste, tu explicación ayudó a encender la bombilla para ayudarme a descubrir cómo hacer que todo funcione. ¡Gracias! – appsecguy

+0

haaaaaaa, gracias! –

+2

No funciona para mí:/Simplemente lo hago exactamente de esta manera en un filtro de servlet –

Cuestiones relacionadas