2016-10-24 61 views
2

我想從我的一臺服務器登錄到另一臺服務器,以發送需要被記錄的跨源請求。可能嗎?Ajax是否可以跨源登錄?

我有兩個Web服務器,A和B可以說www.a.com和www.b.com。 B有一個只能在客戶端登錄時才能使用的API。我需要從A客戶端使用該API。

所以,我來自客戶端的AJAX(POST)登錄請求發送到與CORS標頭,會話cookie和一個成功的重定向B的自家/指數硼。硼反應。

但是,當我做從客戶到B服務器的第二個Ajax請求(JSONP請求),該請求不發送以前的會話cookie收到,因此登錄請求失敗。

如果我手動登錄到www.b.com(在第二瀏覽器標籤),從A到B的所有請求都成功檢測爲登錄的用戶,那麼,乙API從A.

我工作認爲從我的登錄請求收到的會話cookie沒有保存到瀏覽器。

這是我的登錄請求:

$.post("www.b.com/login", { 'j_username': 'username', 'j_password': 'password' }); 

使用:

jqXHR.withCredentials = true; 
settings.crossDomain = true; 

響應頭:

Access-Control-Allow-Headers:x-requested-with 
Access-Control-Allow-Methods:POST, GET, OPTIONS 
Access-Control-Allow-Origin:* 
... 
Location:http://www.b.com/home 
... 
Set-Cookie:JSESSIONID=tY++VWlMSxTTUkjvyaRelZ0o; Path=/ 

收到被保存在cookie來www.a.com或www.b.com?如何從A客戶端ajax請求將此cookie設置爲www.b.com?我認爲這是問題。

+0

當'b.com'以'SET-Cookie'頭,然後是設置了'b.com',這似乎是你想要的cookie的響應。不過,我認爲你需要指定一個非通配符允許的來源(即'http:// www.a.com'而不是'*'),因爲[如果服務器給出通配符'Access-Control' -Allow-Origin:*'response](http://stackoverflow.com/q/19743396/710446)。 – apsillers

回答

3

正如apsillers說,我們不能使用通配符訪問控制允許來源:*。 但這並沒有解決問題。

我在設置jqXHR.withCredentials = true;在beforeSend處理函數中。

$.post({ 
     ... 
     beforeSend: function(xhr) { 
      xhr.withCredentials = true; 
     }, 
     ... 
}); 

由於某些原因,這是行不通的。我必須直接設置憑證的使用:

$.post({ 
     ... 
     xhrFields: { 
      withCredentials: true 
     }, 
     ... 
}); 

此代碼完美地工作!

謝謝你。

+0

使用ExtJS我必須這樣做:'Ext.Ajax.request({withCredentials:true,...})',但是您的提示是解決問題的關鍵! –

相關問題