当我有并发请求时,我的Rails会话正在重置

时间:2010-06-07 22:25:10

标签: ruby-on-rails session

我想我可能会误解Rails会话,所以请耐心等待,我可能不会以最好的方式来表达我的问题。

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

问题是,我的网络视图设置的会话似乎被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开始时它们仍然存在。

因此。我想我错过了会议如何运作的一些内容。为什么从会话中读取会覆盖它?我应该以其他方式访问它吗?我完全走错了路,问题出在其他地方吗?

感谢您的任何见解!

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

您的会话可能是基于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

答案 2 :(得分:-1)

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

祝你好运!