我遇到了一个非常奇怪的问题,这是非常不一致的。我有一个单页应用程序,每隔这么多秒就从我的 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
session[:test]
我在 show_next_slide 控制器操作中的渲染命令之前分配了一个值:
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