0

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

第一次加载我得到会话

{"session_id"=>"xxx"}

保存价值后,我得到

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

当我再次重新加载我的页面时,我得到了重置会话

{"session_id"=>"xxx"}

为什么会这样?

4

3 回答 3

1

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

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

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

after_filter  :set_csrf_cookie

def set_csrf_cookie
   cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
end
于 2013-10-12T18:02:36.627 回答
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 元数据。

于 2013-10-12T18:33:35.680 回答
0

谢谢大家,我发现问题,但我无法解释。后来我从 js 文件中删除行app/assets/javascripts/application.js

//= require jquery_ujs

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

于 2013-10-12T18:42:22.527 回答