Ruby on rails 当我有并发请求时,我的Rails会话将被重置

Ruby on rails 当我有并发请求时,我的Rails会话将被重置,ruby-on-rails,session,Ruby On Rails,Session,我想我可能误解了Rails会话的某些内容,所以请容忍我,我可能没有用最好的方式表达我的问题 我正在开发一个带有Ruby on Rails后端的iPhone应用程序。我有一个web视图,默认情况下,它指向一个控制器的索引操作(并使用会话),在后台,一堆API调用指向另一个控制器(不需要使用会话) 问题是,我的web视图设置的会话似乎被API调用覆盖了。我的暂存服务器非常慢,因此请求之间有很多时间重叠-我在日志中看到的基本情况如下: Request A (first controller) star

我想我可能误解了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.
现在,奇怪的是请求B不应该向会话写入任何内容

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

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

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

所以。我想我遗漏了一些关于会话如何工作的内容。为什么从会话中读取会覆盖它?我应该以其他方式访问它吗?我是不是完全走错了路,问题出在别处了


谢谢你的见解

这可能是因为您正在会话对象中将用户id存储为“:id”:id可以是对象中的保留密钥。尝试使用其他名称,例如会话[:user\u id]


祝你好运

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

这是由rails处理会话的方式引起的竞争条件的结果。看


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

同样的事情也发生在我身上。你找到解决方案了吗?从那时起我就开始了,不再从事这个项目——不知道这个问题是否仍然适用于最新版本的Rails——但我接受这个答案:)
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