我正在尝试在JQuery中的服务器上发出一个简单的GET请求。
$.ajax({
headers: {
"Authorization": "Basic " + btoa("hello" + ":" + "world")
},
url: "http://hello.world?Id=1",
method: "GET",
success: function () {
},
}).then(function () {
});
问题在于,当发送请求时,身份验证标头未正确放入请求中:
Host: hello.world
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: GET
Access-Control-Request-Headers: authorization
Origin: null
Connection: keep-alive
Cache-Control: max-age=0
答案 0 :(得分:9)
当向另一个源发送HTTP请求时,请求可以是“简单”或“非简单”。如果请求使用(或两者)
,则请求变得非常简单Accept
,Accept-Language
,Content-Language
或Content-Type
由于您的请求设置了Authorization
标头,因此不简单。
当请求不简单时,浏览器首先使用OPTIONS方法发送预检请求。这是你在问题中看到的要求。 (请参阅HTML5 Rocks on preflight requests和[我在How does Access-Control-Allow-Origin header work?上的回答)。预检不包括非简单标题,但会在Access-Control-Request-Headers
标题中列出。
如果服务器正确响应了预检,浏览器将然后发出实际请求。在这种情况下,浏览器正在从服务器中查找响应头Access-Control-Allow-Headers: Authorization
,以指示可以在实际请求中发送非简单Authorization
标头。您的服务器必须在其响应中包含该标头。