我有一些设置在会话中保存的功能。但是在 1 次重新加载后,它们会重置并且会话值在那里不存在。
第一次加载我得到会话
{"session_id"=>"xxx"}
保存价值后,我得到
{"session_id"=>"xxx", "value"=>"100"}
当我再次重新加载我的页面时,我得到了重置会话
{"session_id"=>"xxx"}
为什么会这样?
我有一些设置在会话中保存的功能。但是在 1 次重新加载后,它们会重置并且会话值在那里不存在。
第一次加载我得到会话
{"session_id"=>"xxx"}
保存价值后,我得到
{"session_id"=>"xxx", "value"=>"100"}
当我再次重新加载我的页面时,我得到了重置会话
{"session_id"=>"xxx"}
为什么会这样?
您很可能没有在您的一个(可能是 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
伊戈尔是完全正确的。如果您的应用程序发生这种情况,请执行以下操作:
$(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 元数据。
谢谢大家,我发现问题,但我无法解释。后来我从 js 文件中删除行app/assets/javascripts/application.js
//= require jquery_ujs
当我把它放回去时,它会停止重置会话值。