【问题标题】:Accessing the "session key" cookie name from anywhere in Rails从 Rails 的任何地方访问“会话密钥”cookie 名称
【发布时间】:2010-11-03 08:22:33
【问题描述】:

我们正在为 Rails 构建一个插件,以便在 iframe Facebook 应用程序中使用,有一次我们需要检查 Rails 的会话 id cookie 是否已设置。

默认情况下,这个cookie被命名为_myprojectname_session,我们需要找出cookie本身的实际名称。所以如果没有设置,我们可以做一些重定向来确保cookies被设置。

我们如何从任何地方访问该死的 cookie 名称?或者至少在控制器内部?

【问题讨论】:

    标签: ruby-on-rails session cookies


    【解决方案1】:

    我认为会话密钥存储在一个名为 ENV_SESSION_KEY 的变量中

    【讨论】:

      【解决方案2】:

      要从视图或控制器中访问会话 cookie 的名称,您可以说:

      request.session_options[:session_key]
      

      然后要访问该 cookie 的原始值,如果未设置,则为空数组,请使用:

      request.cookies[ request.session_options[:session_key] ]
      

      cookie 名称(又名 session_key)在您的 config/environment.rb 文件中设置。

        config.action_controller.session = {     
          :session_key => '_project_session',
          :secret      => 'long-secret-key'
        }
      

      【讨论】:

      • 嗯,它似乎不起作用。我使用的是 Rails 2.3.2,request.session_options 哈希包含一个名为 :key 而不是 :session_key 的键。它被设置为“_session_id”而不是“_myapp_session”,因为它应该是......哈哈
      • 请注意,在 Rails 2 中,您可能需要在会话键上调用 .to_sym 才能实际访问来自 cookies[<session key>] 的值,例如 request.cookies[request.session_options[:session_key].to_sym]
      【解决方案3】:

      我找到了解决方案。在 Rails 2.3.2 中,至少在 config/initializers/session_store.rb 中设置的会话密钥是这样的:

      ActionController::Base.session = {
        :key         => '_myapp_session',
        :secret      => '[...]'
      }
      

      你可以像这样读取值:

      ActionController::Base.session_options[:key]
      

      自动从Base.sessionBase.session_options,没有多大意义,让我很头疼……哈哈

      【讨论】:

      • 谢谢,我花了半个小时才弄清楚这是哪里
      【解决方案4】:

      还要注意这个在某些 Rails 2.x 版本中影响 session_options 测试的错误:https://rails.lighthouseapp.com/projects/8994/tickets/2303-testrequest-doesnt-initialize-session_options

      【讨论】:

        【解决方案5】:

        根据我的经验,如果键中有下划线,IE 有时不会设置 cookie。换句话说,使用“projectsession”而不是“_project_session”。

        【讨论】:

          【解决方案6】:

          我不知道如何在 rails 3 中执行此操作 :-(

          最终我把它放在了 config/initializers/session_store.rb

          SESSION_KEY = '_myapp_session'
          MyApp::Application.config.session_store :cookie_store, :key => SESSION_KEY
          

          然后在需要的地方访问它,例如在视图中......

          <%= ::ENV_SESSION_KEY %>
          

          【讨论】:

            【解决方案7】:
            Rails.application.config.session_options[:key]
            

            【讨论】:

              【解决方案8】:

              在 Rails 3/4 中,我使用的是这个:

              request.env["rack.request.cookie_hash"]
              

              这是一个散列,包含当前用户的所有 cookie,包括会话的。 哈希以 cookie 的名称作为键,以 cookie 的值作为值

              【讨论】:

                猜你喜欢
                • 2016-05-03
                • 2014-04-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-28
                • 2012-07-20
                • 2011-11-15
                • 2011-04-16
                • 1970-01-01
                相关资源
                最近更新 更多