我想我可能会误解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开始时它们仍然存在。
因此。我想我错过了会议如何运作的一些内容。为什么从会话中读取会覆盖它?我应该以其他方式访问它吗?我完全走错了路,问题出在其他地方吗?
感谢您的任何见解!
答案 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]。
祝你好运!