【问题标题】:Easiest way of making rails sessions persist between browser restarts在浏览器重新启动之间保持 Rails 会话的最简单方法
【发布时间】:2011-06-30 06:09:00
【问题描述】:

实现 cookie 以使会话在浏览器重新启动之间持续存在的最简单方法是什么?

【问题讨论】:

    标签: javascript ruby-on-rails session


    【解决方案1】:

    如果您希望您的 cookie 永远存在,您可以这样做:

    cookies.permanent[:foo] = "bar"
    

    请参阅http://api.rubyonrails.org/classes/ActionDispatch/Cookies.html 上的 cookie 文档

    【讨论】:

      【解决方案2】:

      最好的办法是使用所谓的记住我的 cookie。由于会话 cookie 在浏览器重新启动之间不会持续存在,因此您需要使用其他类型的 cookie 来向您的应用程序表明用户就是他们所说的那个人。最常见的记住我功能是通过让用户选择他们希望应用程序记住它们来实现的。然后发生的事情是您需要创建一个 cookie 作为该用户的密码。通常您需要执行以下操作:

      • 选择与用户相关的、用户无法访问或查看的属性。例如,他们的帐户创建时间,或者您为他们存储的一些随机生成的字符串。
      • 散列此属性,使 cookie 值无法识别。

      这是一个例子:

      identifier = current_user.id
      value = Digest::SHA1.hexdigest(current_user.created_at)[6,10]
      
      cookies['remember_me_id'] = {:value => identifier, :expires => 30.days.from_now}
      cookies['remember_me_key'] = {:value => value, :expires => 30.days.from_now}
      

      最后,当您检查用户是否登录时,您还需要检查他们是否使用记住 cookie 登录。例如:

      def current_user
        current_user ||= login_from_session || login_from_cookie
      end
      
      def login_from_session
        current_user = User.find(session[:id]) unless session[:id].nil?
      end
      
      def login_from_cookie
        user = User.find(cookies['remember_me_id'])
        if cookies['remember_me_key'] == Digest::SHA1.hexdigest(user.created_at)[6,10]
          current_user = user
        else
          nil
        end
      end
      

      这应该可以帮助您开始实施在浏览器重新启动后仍然存在的 cookie。

      【讨论】:

      • 值得指出的是,一些 Rails 身份验证框架(例如 Devise)提供了对此功能的内置支持。值得认真考虑使用这些而不是从头开始构建。
      【解决方案3】:

      http://railscasts.com/episodes/274-remember-me-reset-password?view=comments

      这是 Ryan Bates 关于记住我的饼干的精彩截屏视频!

      【讨论】:

        猜你喜欢
        • 2015-02-24
        • 2023-03-10
        • 2010-11-27
        • 2015-04-08
        • 1970-01-01
        • 2014-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多