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

rub*_*nce 19 ruby-on-rails session-variables

硬盘,主内存或其他地方.我不是要求将这些存储在数据库中的情况.

wan*_*lke 21

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

  • 存储在客户端的isnt cookie和服务器端的会话?我问的是会话变量而不是请求会话. (4认同)
  • 哦......我觉得我有很多需要学习的东西.我有一个错误的概念,即`session`变量存储在服务器端,`cookie`变量存储在客户端.因此,如果重置浏览器cookie,如果我们使用`cookiestore`,`session`变量也将丢失,对吧? (3认同)
  • @kamal会话密钥不存储在cookie中,整个会话数据存储在cookie中(仍然在谈论Rails的默认值).因此,服务器上没有任何存储或匹配.Rails 4使用EncryptedCookieStore,因此服务器端唯一发生的事情是加密/解密会话数据. (3认同)
  • Cookie 随每个请求/响应在客户端和服务器之间发送。只需阅读其他答案中链接的 Rails 指南中的 CookieStore 即可。 (2认同)
  • @rubyprince你离我不远.会话变量可以存储在服务器端(在数据库中),但默认情况下是cookie.重置cookie将重置两种类型的会话存储.本指南对我最有帮助:http://guides.rubyonrails.org/action_controller_overview.html#session (2认同)

iaf*_*nov 16

我建议你看一下rails安全指南的会话章节 - 它会详细解答你的问题并帮助你理解它是如何工作的.

  • 是的,但即使您使用数据库存储会话,它们也将丢失 - 在这种情况下会话ID将丢失 - 所以基本上结果将是相同的. (2认同)

lak*_*are 6

在Rails中,会话对象在cookie内来回发送.


当您session[:user_id] = 3在控制器操作内部进行设置时,从该操作发送的响应将具有标头Set-Cookie: my-session-cookie.从现在开始,浏览器会Cookie: my-session-cookie在每次请求时自动将标头发送回服务器.

这就是my-session-cookie通常看起来的样子:

_Hello_session=BAh7B0kiD3%3D%3D--dc40a55cd52fe32bb3b84ae0608956dfb5824689
Run Code Online (Sandbox Code Playgroud)

这意味着:

_Hello_session=<encrypted user_id=3>--<digital signature>
Run Code Online (Sandbox Code Playgroud)
  • Hello 是您的Rails应用程序的名称.
  • 为了防止邪恶的人理解a=b字符串,它是加密的.
  • 为了防止邪恶的人篡改cookie,使用了数字签名.

加密(和解密)以及签名(和验证)都是使用secrets.secret_key_base存储在其中的服务器端密钥完成的/config/secrets.yml.