3

我正在将 Rails 应用程序从 Rails 2 直接升级到 Rails 4。我正在使用/config/initializers/session_store.rb带有 CookieStore 的新文件,但由于某种原因我的会话没有保存。

当尝试按照以下方式做某事时, render :text => "#{request.session_options[:id]}" 我每次刷新都会获得一个新的会话 ID。

我在不同的浏览器上试过,都应该接受 cookie。

我不知道是怎么回事。为什么这些会话不会持续存在?!

编辑:谢谢大家的建议。这里有更多信息,以及我注意到的一些事情:

  • 首先,关于我的设置——我在我的 Windows 7 机器上的 Ubuntu VM 上通过 RVM 运行带有 Rails 4/Ruby 2 的服务器。
  • 虽然我是从 Rails 2 升级的,但这仅适用于模型/控制器/视图/等——我为所有支持基础设施生成了一个新的 Rails 4 应用程序。
  • 我在同一个虚拟机上创建了另一个应用程序,它只是设置一个会话然后显示,并且工作正常。
  • 会话存储的内容根据用户的操作而略有不同,但通常它只包含一个用户 ID(只是一个整数),偶尔还会包含更多——(我在尝试传递 OAuth 令牌时首先注意到这一点来自 OAuth 宝石。)
  • 我注意到,如果 VM 的系统时钟落后于 Windows 7 主机时钟,则用户 ID 会话保持不变。这会导致其他问题,尤其是 OAuth,但似乎只是某个地方存在时间问题。我尝试过从环境/development.rb 中删除时区等操作,但这并没有帮助。
4

3 回答 3

4

作为一般性答案,有几个可能的问题是

  • 会话大小超过 4K限制(显然是这种情况)。

    如果您尝试存储超过 4K 的数据,则会引发 CookieOverflow。

请记住,如果您将对象存储在会话中,则该对象在存储之前已被序列化,并且其大小会更大。有关一般问题和特定问题的可能解决方案的更多信息,请点击此处

  • CSRF 保护问题。

    如果安全令牌与预期不匹配,会话将被重置

编辑:要检查它是否是 CSRF 案例,您可以按照下面的 Abdo 评论,暂时禁用protect_from_forgeryApplicationController

于 2013-09-02T15:23:36.890 回答
2

我有类似的症状。事实证明这是因为我添加了 rails-api gem,它完全破坏了会话保存。

于 2015-09-17T02:18:10.557 回答
0

来自:Railscasts 第 415 集升级到 Rails 4

在秘密令牌初始化程序中,我们还需要进行另一项配置更改。在 Rails 4 中,此文件中的配置选项已从 secret_token 重命名为 secret_key_base。当我们从 Rails 3 过渡时,我们需要指定这两个选项,但是一旦我们成功迁移了我们的应用程序,我们就可以删除 secret_token 选项。最好为我们的 secret_key_base 使用不同的令牌。

这是必要的,因为我们正在从存储在客户端的序列化 cookie 转移到加密的 cookie。这可以防止用户轻松查看其会话 cookie 的内容。

这一集包括一系列关于从 2 升级到 4 的非常好的技巧,我能够使用本教程成功地做到这一点。

于 2013-08-27T21:40:28.200 回答