2011-12-30 60 views
6

我在调查跨域问题,我有一些REST服务调用。 铬对此表示: 请求头域x-要求,与没有被允许接入控制允许头 这是我从网络上得到 - >头选项卡:跨域AJAX REST服务HTTP标题

Request URL: rest_url_on_other_domain 
Request Method:OPTIONS 
Status Code:200 OK 
Request Headers: 
Access-Control-Request-Headers:Origin, x-requested-with, content-type, accept 
Access-Control-Request-Method:POST 
Origin:http://localhost:8080 

Response Headers 
Access-Control-Allow-Headers:Content-Type, Accept 
Access-Control-Allow-Methods:GET, POST 
Access-Control-Allow-Origin:* 
Access-Control-Max-Age:1728000 
Cache-Control:no-cache, no-store 
Connection:keep-alive 
Content-Length:0 
Date:Fri, 30 Dec 2011 11:29:12 GMT 
Expires:-1 
Pragma:no-cache 
Server:nginx/1.0.2 

能有人解释这个HTTP头文件?什么是问题 - 某些标头检查服务器失败或某些标头检查客户端(浏览器)失败。关于这个Access头文件的想法是什么?用简单的语言详细解释,只是为了让我感受到自己将要学习的余生。提前致谢!

回答

11

您所看到的是跨源资源共享预检请求。这种请求的请求方法是OPTIONS。这是浏览器用来请求发送实际请求的权限的请求。您可以在这里了解更多信息:http://www.html5rocks.com/en/tutorials/cors/

在这种特殊情况下,浏览器正在询问一堆标题(在Access-Control-Request-Headers标题中)。现在,作为响应,Access-Control-Allow-Headers标题应该包含所有请求的标题。如果有多于请求的标题,浏览器不会抛出任何异常。在此示例中,您的响应标题应如下所示:

Access-Control-Allow-Headers: Origin, x-requested-with, content-type, accept 

所有其他响应标头看起来都不错。一旦服务器发送此响应,浏览器将发送第二个请求,这是数据的实际请求。

+1

但是,预检请求的想法是什么 - 他将获得这些头信息。对话是这样的:预检请求(Origin Header-“你支持哪些域名”,x请求 - 与 - “你是否支持XMLHttpRequests?”,...),当它们在预检响应中被重复时,意味着“是“对他们全部或者这样比喻是不好的。当浏览器发送真正的请求时 - 满足哪些条件(简单例子)。谢谢! – EnTrERy 2011-12-30 22:03:12

+1

预检是浏览器问:“嗨服务器!我在这里有一个请求,它来自这个域,它使用这个http方法,它有这些请求头。如果我发送实际的请求,它很酷吗?”然后,服务器通过发回Access-Control-Allow- *标头来确认预检请求。它使用这些头文件而不是简单的确定的原因是,预检响应可以在第一次请求后被缓存。这样,每次请求都不需要发布预检,这可以节省带宽。 – monsur 2011-12-31 02:33:03

+1

非常感谢您的详细解释! – EnTrERy 2011-12-31 12:29:55