我使用Ember.js,Ember Simple Auth插件和jQuery使用ajax發送Authorization
標頭跨域。當Authorization
頭設置:HTTP標題設置授權標題停止加載數據
jqXHR.setRequestHeader('Authorization', 'Bearer ' + session.get('authToken'));
然後我得到一個飛行前OPTIONS
請求REST URL我然後恢復下列頭:
$headers->set('Access-Control-Allow-Origin', 'http://subdomain2.domain.com');
$headers->set('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
$headers->set('Access-Control-Allow-Headers', 'Content-Type, Authorization, Accept');
$headers->set('Access-Control-Max-Age', 10);
$headers->set('Content-Length', 0);
在Chrome的網絡監控,這個OPTIONS
請求返回成功。然後,當GET請求是飛行前OPTIONS
請求後,GET
請求剛剛掛起,或者至少說(pending)
網絡監控:
如果我刷新頁面幾秒鐘後,頁面會顯示,但在OPTIONS
呼叫之後不會立即顯示。
當我玩Access-Control-Max-Age
標題並增加緩存時間時,我可以刷新很多次,然後再次發送OPTIONS
呼叫,這意味着頁面將顯示正常。只有當OPTIONS
呼叫與GET
立即掛起之後。
當我直接在瀏覽器中加載url時,它顯示JSON數據就好了。即使當我使用Chrome擴展郵差,並手動設置Authorization
頭與jQuery請求相同,它仍然加載數據就好(雖然我不認爲郵差模擬跨域請求)。
任何想法爲什麼GET
請求保持掛起狀態並且不返回任何錯誤或頭文件?
很奇怪,因爲如果我刷新它似乎工作,所以我做了'OPTIONS'請求後返回正確的標題。我沒有更改'SimpleAuth'代碼 - 我確實注意到if(!jqXHR.crossDomain &&!Ember.isEmpty(session.get('authToken'))){'但'jqXHR'對象沒有包含'crossDomain'屬性......我實際上發現跨域屬性在'options'對象中。可能是系統中的錯誤或差異?我暫時通過將'REST'服務器更改爲相同的域來解決這種情況。我不認爲這是一個SimpleAuth問題,也許是一個錯誤......我不確定。 – Wasim
我也嘗試在發送'Authorization'頭之前添加'jqXHR.withCredentials = true;',但這不能解決問題。 – Wasim