2010-11-04 100 views
5

我正在製作一個基於PhoneGap的iPhone應用程序,它將連接到Rails後端。我正在使用jQuery爲Rails服務器創建一個Ajax請求。我正在成功獲取服務器響應,但我在獲取Cookie和管理會話方面遇到問題。如何在Rails中的JSON響應中包含Cookie?

默認情況下,Rails在響應HTML請求時發送Set-cookie標頭。當Rails向Ajax請求發送JSON響應時,這似乎不會發生。

當Ajax請求發送到Rails服務器時,有沒有辦法發送Set-Cookie頭?

這裏是我在我的ApplicationController中(我使用設計的驗證):

def sign_in_and_redirect(resource_or_scope, resource=nil) 
scope  = Devise::Mapping.find_scope!(resource_or_scope) 
resource ||= resource_or_scope 
sign_in(scope, resource) unless warden.user(scope) == resource 
respond_to do |format| 
    format.html {redirect_to stored_location_for(scope) || after_sign_in_path_for(resource) } 
    format.json {render :json => { :success => true, :session_id => request.session_options[:id], :current_user => current_user} } 
end 

這裏是jQuery的功能,我使用,使Ajax請求

$('#user_submit').click(function(){ 
    $.ajax({beforeSend: function(xhrObj){ xhrObj.setRequestHeader("Accept","application/json");}, 
     type: 'POST', 
     url: 'http://localhost:3000/users/sign_in', 
     data: "{'user':{'remember_me':'0','password':'pass1word','email':'[email protected]'}}", 
     contentType: "application/json", 
     dataType: "application/json", 
     complete: function(data, textStatus){ 
     } 
    }); 
}); 

我的天堂不會通過谷歌搜索得到明確的答案,所以希望你能提供幫助。我發現這一點,但沒有發現它太大的幫助:

http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/66751d8e54f2fee6

回答

0

它看起來像Rails會默認響應一個Ajax JSON請求時確實發送一個Set-Cookie頭。問題在於Safari不接受Cookie,因爲它將其視爲外部來源。要接受Cookie,在本地Safari中測試基於HTML的iPhone應用程序時,您需要在Safari中將「接受cookie」的安全性首選項更改爲「始終」。

在PhoneGap的,你可以從我可以告訴做到這相當於在幾個方面:

http://groups.google.com/group/phonegap/browse_thread/thread/3290c5ac4e05be69?fwc=1 http://stackoverflow.com/questions/3709315

0

我見過的同樣的問題,我無法證實你對自己的回答所說的話。當我使用curl兩次執行請求時,第一次使用「Accept:text/html」,第二次使用「Accept:application/json」時,服務器在後一種情況下不發送Set-Cookie頭。不幸的是,我還沒有拿出解決方案。

specification說:

「如果用戶代理支持HTTP狀態
管理應該堅持,放棄 和發送cookie(如 的Set-Cookie接受和Set-COOKIE2響應 頭,並在適用的情況下發送至Cookie 標題)。「

由於此規範是候選推薦標準,因此它可能還沒有在瀏覽器中一致地實現。因此服務器可能會忽略設置cookie,我不知道。