【问题标题】:Why is sessions reset in my rails application?为什么我的 Rails 应用程序中的会话会重置?
【发布时间】:2013-10-20 16:05:17
【问题描述】:

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

第一次加载我得到会话

{"session_id"=>"xxx"}

保存价值后我得到

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

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

{"session_id"=>"xxx"}

为什么会这样?

【问题讨论】:

  • 你是如何操作会话的?
  • 添加 - session[:value] = 100 并删除 - session[:value] = nil

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


【解决方案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】:

    您很可能没有在您的一个(可能是 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
    

    【讨论】:

    • 我在 head 标签中有 <%= csrf_meta_tags %>。你是这个意思吗?
    【解决方案3】:

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

    //= require jquery_ujs
    

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

    【讨论】:

    • 酷!不知道 jquery_ujs 处理 CSRF 令牌(这是合乎逻辑的 btw)。不要忘记接受你自己的答案,以便其他人知道什么对你有用。
    猜你喜欢
    • 2020-03-24
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2016-05-28
    • 2020-05-10
    相关资源
    最近更新 更多