Rails ActiveRecord会话存储在HTML5 SessionStorage而不是Cookie中

时间:2013-08-19 14:48:28

标签: ruby-on-rails html5 session activerecord session-storage

我的应用程序要求用户在浏览器的不同标签中登录不同的帐户(我们专门针对Chrome)。由于Rails使用cookie来存储会话信息,因此当用户登录时,他们将登录浏览器中的所有选项卡。我正在使用ActiveRecord会话存储方法,但即使会话的ID也保存为cookie。

似乎有一个使用HTML5的sessionStorage机制的解决方案,该机制的范围仅限于用户登录的选项卡或窗口。我似乎只需要将会话信息保存到sessionStorage而不是cookie中。但我根本找不到相关信息。

假设无法在Rails中配置会话存储来执行此操作,是否可以覆盖ActiveRecord会话保存机制?关于在哪里寻找有关如何进行此操作的信息的任何指示?

2 个答案:

答案 0 :(得分:1)

与Cookie不同,sessionStorage条目无法使用响应标头创建,并且不会自动包含在请求标头中。这为在客户端Javascript上管理基于sessionStorage / localStorage的身份验证带来了大量工作量。所有经过身份验证的访问都必须通过明确包含身份验证令牌的Javascript XHR请求。

如果您希望用户能够拥有多个并发会话,并且您不希望将您的网站构建为SPA,那么您将不得不采用其他Cookie方法。< / p>

一种方法是使用多个域强制cookie进入单独的子空间。设置通配符DNS记录并将Web服务器配置为接受所有匹配的请求,而不管前缀如何。例如,默认情况下,用户可能位于www.yoursite.com。您将提供“创建新会话”#39;用于打开随机子域的新标签的链接,例如1234abcd.www.yoursite.com。但是,如果您使用SSL,这可能会产生问题;通配符SSL证书往往要贵得多。

更简单的方法是教育用户关于他们的浏览器&#39; private / icognito模式,用于维护独立的cookie存储。但是,让用户阅读文档总是一个挑战。

答案 1 :(得分:-1)

现在,您可以通过初始化程序配置基于Cookie的会话存储,可能在 config / initializers / session_store.rb 中。在Rails 3中,会话存储是一个中间件,配置选项通过一次调用传递给config.session_store:

您的:: Application.config.session_store:cookie_store,:key =&gt; '_session'

您可以在哈希中添加所需的任何额外选项:key,例如

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