cross-origin resource sharing (CORS) con jQuery y Tornado

Digamos, tengo un Tornado web del servidor (localhost) y una página web (othermachine.com), y el segundo contiene código javascript que necesita para hacer cross-domain llamadas ajax para el Tornado servidor.

Así que puedo configurar mi Tornado como tal:

class BaseHandler(tornado.web.RequestHandler):
    def set_default_headers(self):
        self.set_header("Access-Control-Allow-Origin", "http://www.othermachine.com")
        self.set_header("Access-Control-Allow-Credentials", "true")
        self.set_header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS")
        self.set_header("Access-Control-Allow-Headers",
            "Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, X-Requested-By, If-Modified-Since, X-File-Name, Cache-Control")

Y mi javascript hace una llamada jQuery:

$.ajax({
    type: 'GET',
    url: "http://localhost:8899/load/space",
    data: { src: "dH8b" },
    success: function(resp){
        console.log("ajax response: "+resp);
    },
    dataType: 'json',
    beforeSend: function ( xhr ) {
        xhr.setRequestHeader('Content-Type', 'text/plain');
        xhr.setRequestHeader('Access-Control-Request-Method', 'GET');
        xhr.setRequestHeader('Access-Control-Request-Headers', 'X-Requested-With');
        xhr.withCredentials = true;
    }
});

Pero me da la encantadora XMLHttpRequest cannot load http://localhost:8899/load/space?src=dH8b. Origin http://www.othermachine.com is not allowed by Access-Control-Allow-Origin de error. Yo no puedo decir de qué lado de jQuery /Tornado (o ambos?) no estoy de configurar correctamente.

Según dev tools, estos son los encabezados de jQuery solicitud de envío:

Encabezados De Solicitud

Accept:*/*
Origin:http://www.othermachine.com
Referer:http://www.othermachine.com/athletes.html?src=BCYQ&msgid=6xjb
User-Agent:Mozilla/5.0 ...

Si yo simplemente hacer una petición de mi campo url del navegador puedo obtener un «200 OK» con esto:

Los Encabezados De Respuesta

Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Content-Type, User-Agent, X-Requested-With, X-Requested-By, Cache-Control
Access-Control-Allow-Methods:GET,POST
Access-Control-Allow-Origin:http://www.othermachine.com
Content-Length:0
Content-Type:text/html; charset=UTF-8
Server:TornadoServer/2.2.1

Significa eso Tornado está haciendo su trabajo? He intentado seguir los consejos de todos los stackoverflow CORS+jQuery puestos (por ejemplo,este), fue en vano. CORS en concepto parece bastante simple, pero tal vez estoy fundamentalmente de la incomprensión de lo que se supone que debe ocurrir en un CORS de transacciones… por favor ayuda! Gracias de antemano.

  • Me lo imaginé, véase la respuesta a continuación, voy a marcar tan pronto como mi 2 día límite de tiempo permite.
  • Conocí a este problema. Pero los métodos anteriores no pueden resolver por mí. Yo uso github.com/globocom/tornado-cors , y las cosas funciona.
InformationsquelleAutor kradeki | 2012-07-13

2 Kommentare

  1. 18

    Nevermind, codificación demasiado tarde y demasiado largo hace que uno tropezar con las cosas del tamaño de errores tipográficos. Para el registro, esto es todo lo que necesita para jQuery:

    var data = { msgid: "dH8b" },
        url = "http://localhost:8899/load" + '?' + $.param(data);
    $.getJSON( url, function(resp){
        console.log("ajax response: "+resp+" json="+JSON.stringify(resp));
    });

    Y esto es todo lo que necesita para Tornado:

    class BaseHandler(tornado.web.RequestHandler):
        def set_default_headers(self):
            self.set_header("Access-Control-Allow-Origin", "http://www.othermachine.com")

    Usando jQuery 1.7.2, Tornado 2.2.1.

  2. -1

    probar la configuración de origen: othermachine.com. debe ser un nombre de dominio, no una dirección de sitio web

    • el origen tiene que ser un FQDN incluyendo un plan y el puerto.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea