Rails 3:会话在请求之间被清除

时间:2013-10-11 10:00:25

标签: ruby-on-rails-3 session

我遇到了一个非常奇怪的问题,这是非常不一致的。我有一个单页应用程序,每隔几秒就从我的Rails 3应用程序请求json。在服务器端,我使用active_record_store存储浏览器的会话信息。

问题是在两个请求之间,有时会清除会话信息。这是日志的一部分:

Started GET "/channels/2/show_next_slide.json?current_slide_slot_id=1806" for 127.0.0.1 at 2013-10-11 11:35:10 +0200
Processing by ChannelsController#show_next_slide as 
  Parameters: {"current_slide_slot_id"=>"1806", "id"=>"2"}
******* Test=
******* Session ID=ff7010bb1db040b90caa965b7736ad25
...
******* Test=1806
******* Session ID=ff7010bb1db040b90caa965b7736ad25
Completed 200 OK in 148ms (Views: 3.3ms | ActiveRecord: 4.3ms)
127.0.0.1 GET /channels/2/show_next_slide.json?current_slide_slot_id=1806 200 OK ChannelsController#show_next_slide JSON 148.1 (DB 4.3, View 3.3) {"current_slide_slot_id"=>"1806", "id"=>"2"} {}


Started GET "/assets/plugins/w/101d.png" for 127.0.0.1 at 2013-10-11 11:35:14 +0200
Served asset /plugins/w/101d.png - 304 Not Modified (0ms)


Started GET "/assets/plugins/w/102n.png" for 127.0.0.1 at 2013-10-11 11:35:14 +0200
Served asset /plugins/w/102n.png - 304 Not Modified (0ms)


Started GET "/assets/plugins/w/103n.png" for 127.0.0.1 at 2013-10-11 11:35:14 +0200
Served asset /plugins/w/103n.png - 304 Not Modified (0ms)


Started GET "/assets/plugins/w/109.png" for 127.0.0.1 at 2013-10-11 11:35:14 +0200
Served asset /plugins/w/109.png - 304 Not Modified (0ms)


Started GET "/channels/2/show_next_slide.json?current_slide_slot_id=1806" for 127.0.0.1 at 2013-10-11 11:35:15 +0200
Processing by ChannelsController#show_next_slide as 
Parameters: {"current_slide_slot_id"=>"1806", "id"=>"2"}
******* Test=
******* Session ID=ff7010bb1db040b90caa965b7736ad25

application_controller我设置了一个before_filter和after_filter,将session[:test]的内容写入日志(显示为******* Test=)。如您所见:第一个请求以session[:test]=1806结束,但是在下一个请求session[:test]为空时。偶尔会发生这种情况;并非总是如此。

如您所见,两个请求中的会话ID相同。此外,csrf令牌也很好地传递。只是为了确保我已禁用protect_from_forgery,但这没有任何区别。所以这似乎不是一个问题。

我使用的唯一其他“第三方代码”和会话功能是Devise。所以也许那里发生了一些事情,但我想不出任何事情......

有没有人知道这里会发生什么?

其他信息

在application_controller中,我在before_filter和after_filter中调用以下方法:

def log_session_for_debugging
  logger.debug("******* Test=#{session[:test]}")
  logger.debug("******* Session ID=#{request.session_options[:id]}")
end

我在show_next_slide控制器操作中的render命令之前为session[:test]赋值:

  respond_to do |format|
    format.json { 
      session[:test] = @slide_slot.to_param
      render :json => @slide_slot ? @slide_slot.as_json_with_slide_and_elements() : {} 
    }
  end

1 个答案:

答案 0 :(得分:0)

我还没有找到问题的确切原因,但我确实有一些代码允许具有特定角色的用户以其他方式登录。我正在使用Warden级代码。我已经转而使用额外的Devise策略(遵循此this great article),这使问题消失了。