2013-08-19 70 views
11

我的應用程序要求用戶在其瀏覽器(我們專門針對Chrome)的不同標籤中登錄到不同帳戶。由於Rails使用cookie來存儲會話信息,因此當用戶登錄時,它們會在瀏覽器中的所有選項卡上登錄。我正在使用ActiveRecord會話存儲方法,但會話的ID也被保存爲一個cookie。Rails ActiveRecord會話存儲在HTML5 SessionStorage而不是Cookie

似乎有一個使用HTML5的sessionStorage機制的解決方案,該機制在用戶登錄的選項卡或窗口的範圍上受到限制。看起來我所要做的就是直接使用Rails將會話信息保存到sessionStorage而不是cookie中。但我根本找不到這方面的信息。

假設沒有辦法配置會話存儲在Rails中執行此操作,是否可以重寫ActiveRecord會話保存機制?任何關於如何去尋找信息的指針?

+1

您是否找到了該問題的答案? – Marklar

回答

-1

您現在通過初始化程序配置基於Cookie的會話存儲,可能位於config/initializers/session_store.rb。在Rails 3中,會話存儲是一件中間件,配置選項通過一次調用傳遞給config.session_store:

Your :: Application.config.session_store:cookie_store,:key =>'_session '

你可以在hash中加入任何你想要的選項:key,eg

Your::Application.config.session_store :cookie_store, { 
    :key =>   '_session_id', 
    :path =>   '/', 
    :domain =>  nil, 
    :expire_after => nil, 
    :secure =>  false, 
    :httponly =>  true, 
    :cookie_only => true 
} 
+0

我在這裏配置會話存儲並使用ActiveRecord會話存儲。我如何管理這個以保存HTML5 sessionStorage而不是cookie? –

1

與cookie不同,sessionStorage條目不能用響應頭創建,並且不會自動包含在請求頭中。這爲管理基於sessionStorage/localStorage的客戶端Javascript驗證帶來了很多工作量。所有經過身份驗證的訪問必須通過明確包含身份驗證令牌的Javascript XHR請求。

如果您希望用戶能夠擁有多個併發會話,並且您不想將自己的站點構建爲SPA,那麼您將不得不採取另一種方式使用cookie。

一種方法是使用多個域來強制將cookie分成不同的子空間。設置通配符DNS記錄並將您的Web服務器配置爲接受所有匹配的請求,而不考慮前綴。例如,用戶可能默認爲www.yoursite.com。您需要提供一個「創建新會話」鏈接,該鏈接會向隨機子域打開一個新標籤,例如, 1234abcd.www.yoursite.com。但是,如果您使用SSL,則可能會產生問題;通配符SSL證書往往要貴得多。

一個簡單的方法是教育用戶瀏覽器的私有/ icognito模式,它們保持獨立的cookie存儲。但是,讓用戶閱讀文檔始終是一個挑戰。

相關問題