【问题标题】:Why session does not be duplicated in rails为什么会话不会在 Rails 中重复
【发布时间】:2017-07-17 14:46:25
【问题描述】:

我正在学习 Rails 中的会话和 cookie,但我对在 Rails 中存储会话感到困惑。 当用户(名为 U1)登录到 Rails 服务器(名为 A)时,A 将创建一个会话并将其存储在某处:

session[:user_id] = user.id

如上面的命令,我会认为用户 U1 的会话将被存储到一个 session 数组中,并且具有索引 user_id。 但是当另一个用户(名为 U2)登录到服务器 A 时,上面的命令也会被调用,并且索引是 user_id。那么为什么 U1 的索引 user_id 没有被 U2 的 user_id 替换(因为用户 U1 和 U2 都使用共享的 session 数组)

【问题讨论】:

  • 如果你使用不同的浏览器实例(窗口),cookies不会相互共享,所以你的会话密钥是不同的。

标签: ruby-on-rails session cookies


【解决方案1】:

为每个用户创建了一个单独的session。这是由服务器完成的,服务器会跟踪每个用户的会话。

【讨论】:

  • “每个用户”在这里是指“每个浏览器”还是“每个 IP 地址”?如果我打开 2 个窗口浏览器,那么可以假设 2 个用户?
【解决方案2】:

工作原理:

1.当您在应用中调用session[:current_user_id] = 1,并且会话尚不存在时:

2.Rails 将在您的会话表中创建一条带有随机会话 ID 的新记录(例如,09497d46978bf6f32265fefb5cc52264)。

3.它将{current_user_id: 1} (Base64-encoded)存储在该记录的数据属性中。

4.它会使用Set-Cookie将生成的session ID, 09497d46978bf6f32265fefb5cc52264返回给浏览器。

下次您请求页面时,

1.浏览器使用 Cookie: 标头将相同的 cookie 发送到您的应用程序。

像这样:

Cookie: _my_app_session=09497d46978bf6f32265fefb5cc52264;
path=/; HttpOnly

2.当您拨打session[:current_user_id]时:

3.您的应用从 cookie 中获取会话 ID,并在会话表中找到其记录。

4.然后,它从该记录的数据属性中返回current_user_id。

【讨论】:

  • 我不使用上面的 ActiveRecord 会话,我正在从 rails 教程书学习 rails。
  • @Hung 好的,这只是为了你的知识。
  • @Hung 如果你对我的回答满意,那就改正
  • 我不满意,但它为我提供了额外的知识。
  • @Hung 你能告诉我为什么我的答案没有投票或没有更正,我相信我的答案是正确的
猜你喜欢
  • 2020-03-24
  • 2013-10-20
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 2016-05-25
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多