我有一个简单的龙卷风服务器,它有类:
class BaseHandler(tornado.web.RequestHandler):
def set_default_headers(self):
print "setting headers!!!"
self.set_header("Access-Control-Allow-Origin", "*")
当发出常规(无CORS)请求时,服务器按预期应答,包括Access-Control-Allow-Origin标头 . 但是当我发出来自不同域的帖子请求时(使用 jQuery.post
),响应为404并显示错误:“XMLHttpRequest无法加载http://dev-machine:8090/handshake . 请求的资源上没有'Access-Control-Allow-Origin' Headers . 因此不允许原点'http://localhost:8090'访问 . 响应的HTTP状态代码为404.“
你能告诉我是否遗漏了什么吗? (另一个 Headers /其他配置/其他)
3 回答
您的代码缺少预检,
OPTIONS
请求 .https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS:
要实现预检处理程序,只需添加具有相同 Headers 且没有正文的选项处理程序 .
edit
我已将
x-requested-with
标头添加到允许列表中 . 这里是简单的jquery示例:还有一些关于科尔斯的好文章 - http://dev.housetrip.com/2014/04/17/unleash-your-ajax-requests-with-cors/
kwarunek的答案让我找到了解决PUT和DELETE请求问题的方法 . 唯一的问题是,该解决方案对于使用GET和POST的示例而言过于合适 . 在这种情况下的线
实际上是足够的(如果浏览器之前没有阻止CORS) . 它与PUT和DELETE请求最相关 . 在网络级别上发生的事情可能比在GET / POST情况下稍微复杂一些 .
"If the request is a "非简单" request, the browser first sends a data-less "预检" OPTIONS request, to verify that the server will accept the request. A request is non-simple when using an HTTP verb other than GET or POST (e.g. PUT, DELETE)." cf. non-simple requests
现在,从
BaseHandler
继承的所有处理程序都具有完全CORS功能:即使有了以前的答案,我仍然有以下CORS错误:
并且 solution 也允许 Headers :