Rails中的会话变量存储在哪里?

24

硬盘、主内存或其他地方。我不是在询问它们存储在数据库中的情况。

3个回答

22

默认情况下,Rails使用cookie来存储会话数据。所有的数据都存储在客户端,而不是服务器上。


6
Cookie 存储在客户端,而 Session 存储在服务器端。我正在问关于会话变量,而不是请求会话。 - rubyprince
2
每个请求/响应之间都会在客户端和服务器之间发送Cookie。只需阅读其他答案中链接的Rails指南中的CookieStore即可。 - wanderfalke
3
哦..我感觉我需要学习很多..我曾经有个错误的概念,认为session变量存储在服务器端,而cookie变量存储在客户端。所以,如果我们使用cookiestore,重置浏览器cookiessession变量也将丢失,对吗? - rubyprince
2
@rubyprince 你说得不错。会话变量可以存储在服务器端(数据库中),但默认情况下是存储在cookie中的。重置cookie将同时重置两种类型的会话存储。对我来说,这个指南是最有帮助的:http://guides.rubyonrails.org/action_controller_overview.html#session - jvans
3
不是存储会话密钥在cookie中,而是整个会话数据存储在cookie中(仍然是Rails的默认设置)。因此,在服务器上没有任何存储或匹配的内容。Rails 4使用EncryptedCookieStore,因此服务器端唯一发生的事情就是加密/解密会话数据。 - wanderfalke
显示剩余4条评论

15

我建议您查看Rails安全指南的会话章节 - 它详细回答了您的问题并帮助您理解其工作原理。


谢谢提供的链接,它帮助我理解了关于会话的概念,以及我的错误想法。我应该认真阅读完整个指南。所以,如果浏览器 cookie 被重置,使用 cookiestore 的话,session 变量中的数据将会丢失,对吗? - rubyprince
2
是的,但即使您使用数据库来存储会话,它们也会丢失 - 在这种情况下,会话ID将丢失 - 因此基本上结果将是相同的。 - iafonov

14

在Rails中,会话对象是通过cookie来回传递的。


当您在控制器操作中设置session[:user_id] = 3时,从该操作发送的响应将具有标头Set-Cookie: my-session-cookie。 从现在开始,浏览器将自动在每个请求上向服务器发送标头Cookie: my-session-cookie

这通常是my-session-cookie的样子:

_Hello_session=BAh7B0kiD3%3D%3D--dc40a55cd52fe32bb3b84ae0608956dfb5824689

这翻译成:

_Hello_session=<encrypted user_id=3>--<digital signature>
  • Hello是你的Rails应用程序的名称。
  • 为了防止邪恶的人理解字符串a=b,它被加密
  • 为了防止邪恶的人篡改cookie,使用数字签名

加密(和解密)以及签名(和验证)都使用存储在/config/secrets.yml中的服务器端秘钥secrets.secret_key_base执行。


Rails确实提供了其他的会话存储选项,包括sessionId+database基于非加密cookie的会话,但这个是默认选项。 - Evgenia Karunus
谢谢。在2011年提出这个问题后,我终于明白了。当时我对cookie的作用和内容并没有很好的理解。但是后来我学到了,这个问题成为了我的触发点。感谢您的回答,它将帮助其他像我几年前一样处于类似情况的人。+1,因为您的回答思路清晰、简洁明了。 - rubyprince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接