考慮到這一點之後跨域請求(在Safari 5.0.2,任何操作系統複製f.ex.):傳遞自定義頁眉在跨域Ajax請求一些老的瀏覽器
請求
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://myhost.tld/odata/Account(518059)', false);
xhr.setRequestHeader('Authorization','Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJsb2phYWxpLXdlYmFwaS5jbG91ZGFwcC5uZXQiLCJleHAiOjEzOTQxMjM2MzcsImlzcyI6IldlYkFwaSIsImNhbXBJZCI6MjksInBvcnRhbElkIjozMiwidXNlcklkIjo1MTgwNTl9.c8223aYpb4X7kwYLSmSSQr4wGytxcYtOzTlQuHa9mYU');
xhr.send();
xhr.responseText;
響應
Error: NETWORK_ERR: XMLHttpRequest Exception 101
接頭
OPTIONS /odata/Account(518059) HTTP/1.1
Host: myhost.tld
Accept: */*
Accept-Language: en-US
Access-Control-Request-Method: GET
Origin: http://myclient.tld
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.2; en-US) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5
Accept-Encoding: gzip, deflate
Access-Control-Request-Headers: Authorization
Content-Length: 0
Connection: keep-alive
Connection: keep-alive
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.5
Access-Control-Allow-Origin: http://myclient.tld
Access-Control-Allow-Methods: GET
Access-Control-Allow-Headers: Authorization
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 06 Mar 2014 16:37:26 GMT
Content-Length: 0
我驗證了網頁API正確處理該請求,並用確實HTTP 200返回數據。然而,請求似乎未能對一些舊的瀏覽器。所以,我繼續和硬編碼授權令牌在服務器端,並從公式離開它和:
請求
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://myhost.tld/odata/Account(518059)', false);
xhr.send();
xhr.responseText;
響應
{
'odata.metadata': 'http://myhost.tld/odata/$metadata#Account/@Element',
'Id': 518059,
'userName': '643033849'
}
瞧,它突然開始工作。所以,我下載整個互聯網到我的硬盤驅動器並閱讀它,但無法找到f.ex的驗證。較舊的Safaris不支持包含跨域請求的自定義標頭,我也無法找到可能的解決方案,無需進入明顯的Http Handler或JSONP路由。
因此,除了上述「修復」之外,我還有什麼可以將此令牌從我的客戶端安全地傳輸到服務器,從而避免了自定義標頭。或者,有沒有辦法讓他們工作?
Cookie?
請不要這樣建議。除非用戶訪問了跨域請求的目標站點,否則一些Safari版本(包括5.0.2)會阻止跨域Cookie。