为什么在我的rails应用程序中重置会话?

时间:2013-10-12 17:55:35

标签: ruby-on-rails ruby ruby-on-rails-3 session session-variables

我有一些功能,我在会话中保存了哪些设置。但重新加载1次后,它们会重置并且会话值不存在。

首次加载我得到会话

{"session_id"=>"xxx"}

保存价值后我得到了

{"session_id"=>"xxx", "value"=>"100"}

当我再次重新加载页面时,我会重置会话

{"session_id"=>"xxx"}

为什么会这样?

3 个答案:

答案 0 :(得分:1)

很可能你没有在你的一个(可能是AJAX)请求中传递CSRF令牌。如果rails收到无效的CSRF令牌 - 它会重置会话。

退房:http://guides.rubyonrails.org/security.html#cross-site-request-forgery-csrf

更新:Vidya是对的。您可能还想将以下代码添加到ApplicationController中 - 为AJAX调用设置XSRF令牌

after_filter  :set_csrf_cookie

def set_csrf_cookie
   cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
end

答案 1 :(得分:1)

伊戈尔完全正确。如果您的应用程序中出现这种情况,请执行以下操作:

$(document).ajaxSend((event, jqxhr, settings) ->
    jqxhr.setRequestHeader("X-CSRF-Token", $('meta[name="csrf-token"]').attr('content'))
    jqxhr.setRequestHeader("X-CSRF-Param", $('meta[name="csrf-param"]').attr('content'))
    return
)

现在是CoffeScript,并假设您使用的是JQuery。无论如何,重点是您需要随着Ajax请求发送CSRF元数据。

答案 2 :(得分:0)

感谢每一个人,我发现问题,但我无法解释。 稍后我从js文件app/assets/javascripts/application.js

中删除行
//= require jquery_ujs

当我把它放回去时,它会停止重置会话值。