【问题标题】:My Rails session is getting reset when I have concurrent requests当我有并发请求时,我的 Rails 会话正在重置
【发布时间】:2012-10-25 06:29:04
【问题描述】:

我想我可能对 Rails 会话有一些误解,所以请多多包涵,我可能没有用最好的方式表达我的问题。

我正在开发一个带有 Ruby on Rails 后端的 iPhone 应用程序。我有一个网络视图,默认情况下会转到一个控制器的索引操作(并使用会话),而在后台,一堆 API 调用会转到另一个控制器(并且不需要使用会话)。

问题是,我的 Web 视图设置的会话似乎被 API 调用所覆盖。我的登台服务器非常慢,因此请求有很多时间相互重叠 - 我在日志中看到的基本上是这样的:

Request A (first controller) starts.  Session is empty.
Request B (second controller) starts.  Session is empty.
Request A finishes.  Request A has done authentication, and stored the user ID in the session. Session contains user ID.
Request B finishes.  Session is empty.
Request C starts.  Session is empty - not what I want.

现在,奇怪的是请求 B 不应该向会话写入任何内容。

我确实有从会话中读取的前后过滤器 - 例如:

user = User.find_by_id(session[:id])

logger.debug session.inspect

如果我删除所有这些,那么一切都会按预期工作 - 会话内容由请求 A 设置,并且当请求 C 启动时它们仍然存在。

所以。我想我错过了关于会话如何工作的一些东西。为什么从会话中读取会覆盖它?我应该以其他方式访问它吗?我是否完全走错了路,问题出在其他地方?

感谢您提供任何见解!

【问题讨论】:

  • 同样的事情也发生在我身上。您找到解决方案了吗?

标签: ruby-on-rails session


【解决方案1】:

这是由 Rails 处理会话的方式引起的竞争条件的结果。见http://www.paulbutcher.com/2007/05/race-conditions-in-rails-sessions-and-how-to-fix-them/

似乎您不能让并发请求修改会话可靠。解决方案是使用不同的会话存储方法(例如 active_record 或 redis),或者您可以消除并发请求。

【讨论】:

  • 从那以后我继续前进,不再从事该项目 - 不知道问题是否仍然适用于最新版本的 Rails - 但我会接受这个答案:)跨度>
【解决方案2】:

您的会话可能是基于 cookie 的。如果是这种情况,那么每个请求都以相同的 cookie(会话)开始。 cookie 保存会话内容。尝试将存储切换到服务器上。但是在您的身份验证情况下,我认为最好不要异步执行此操作。

Request A (first controller) starts.  Session is empty.
Request B (second controller) starts.  Session is empty.
Request A finishes.  Request A has done authentication, and stored the user ID in the session. Session contains user ID
   .....AND returning the session content in a cookie.
Request B finishes.  Session is empty. 
   THIS one is setting blank session.
Request C starts.  Session is empty - not what I want. 
   Thats because B has set reset the session

【讨论】:

    【解决方案3】:

    这可能是因为您在会话对象中将用户 ID 存储为“:id”。 :id 可能是对象中的保留键。尝试使用其他名称,例如 session[:user_id]。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2018-07-21
      • 2014-07-18
      • 2016-05-07
      • 2012-12-03
      • 2020-12-15
      • 2017-04-02
      • 2012-06-27
      • 1970-01-01
      • 2016-10-23
      相关资源
      最近更新 更多