2010-06-07 22 views
3

我想我可能会误解Rails会话的某些内容,因此请耐心等待,我可能不会以最佳方式来表达我的问题。当我有并发请求时,我的Rails会话正在重置

我正在开发一个带有Ruby on Rails后端的iPhone应用程序。我有一个默认情况下转到一个控制器(并使用会话)的索引操作的web视图,并且在后台将一堆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. 

现在,奇怪的是,要求乙方应不会写会议的任何事情。

我有之前和之后从进程中读取过滤器 - 喜欢的东西:

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

logger.debug session.inspect 

,如果我删除所有这些,那么一切正常 - 会议内容由请求A设置,并且当请求C启动时它们仍然在那里。

所以。我想我错过了会议的工作方式。为什么从会话中读取会覆盖它?我应该以其他方式访问它吗?我完全走错了路,问题在别处吗?

谢谢你的任何见解!

+0

同样的事情也发生在我身上。你有没有找到解决方案? – jumpa 2012-07-17 01:33:16

回答

4

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

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

+0

从那时起我就开始工作了,不再在那个项目上工作 - 不知道这个问题是否仍然适用于最新版本的Rails - 但我会接受这个答案:) – 2012-10-23 23:31:39

-1

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

祝你好运!

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 
相关问题