【问题标题】:Session not destroyed when closing browser - RailsTutorial.org关闭浏览器时会话未销毁 - RailsTutorial.org
【发布时间】:2015-12-13 19:12:00
【问题描述】:

在阅读 Michael Hartl 的 railstutorial.org 时,我已进入第 8 章(特别是 8.2.3)。当前的问题是实现一个会话以使用户在多个视图中保持登录状态,但本节中实现的功能应该是一个 临时 会话,当浏览器窗口到期时(将用户注销)已经关闭。这是教科书上的声明:

如果您完全退出浏览器,您还应该能够验证应用程序是否忘记了您的登录状态,需要您重新登录才能看到上述更改。

我已经在 Google Chrome 和 Firefox 上测试了这个功能——我成功登录,导航到多个页面(以确保我的会话在 log_in 重定向之后仍然存在),然后关闭浏览器——但是当我重新加载web 应用程序,我仍然登录。我已将所有代码完全复制到文本中,但无济于事。作为参考,这是我的sessions_helper.rb 文件:

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Returns the current logged-in user (if any).
  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end

end

这是我的sessions_controller.rb 文件(destroy 操作尚未实施,因为我还没有在文本中谈到为注销按钮提供任何功能):

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      # Log the user in and redirect to the user's show page.
      log_in user
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination' 
      render 'new'
    end
  end

  def destroy
  end

结束

注意:在您的回答中,请不要建议添加替代代码或更改现有代码(除非您发现我发布的代码有错误)。教科书假定这是工作代码,不需要任何更改即可正常运行。

【问题讨论】:

    标签: ruby-on-rails ruby session login railstutorial.org


    【解决方案1】:

    请检查您的config/initializers/session_store.rb 文件。应该有类似

    Rails.application.config.session_store :cookie_store, key: '_app_session'
    

    您必须将带有nil 值的expire_after 键添加到选项中:

    Rails.application.config.session_store :cookie_store, key: '_app_session', expire_after: nil
    

    应用此更改后,会话将在用户关闭浏览器时过期。您可以阅读更多关于 cookie 过期的信息here

    【讨论】:

    • 我尝试了您的建议并将expire_after: nil 添加到我的session_store.rb 文件中,并且在关闭浏览器并在新的浏览器会话中加载站点后仍然保持登录状态。我什至尝试手动停止服务器并重新启动它并重新加载页面,我的用户仍然登录。我不知道它是否有区别,但我正在使用 c9.io 来托管这个项目并提供服务网页通过内置的 WEBrick 服务器。但是,我在新的浏览器选项卡中而不是在 c9.io Web 应用程序中加载站点页面。这会有所作为吗?
    • FWIW,我已经在 Chrome、Firefox 和 IE 中尝试过。在 Chrome 和 Firefox 中,会话在浏览器重新启动后仍然存在。在 IE 中,会话已过期,我必须在打开新的浏览器窗口时重新登录(这是正确的行为)。
    • 你应该这样做:应用更改(expire_after: nil),重新启动服务器,注销。下次登录后,会话应在浏览器关闭后过期。可以简单地检查想要的行为 - config/initializers/session_store.rb 中提到的带有名称的 cookie(在我的示例中是 '_app_session')不应该有过期时间。
    • 关于 c9.io - 我根本不知道它的行为。为什么不使用自己的 PC?
    • 那么这个问题没有有效的解决办法,当然除了设置过期时间?
    【解决方案2】:

    我知道我迟到了七个月,但我也有同样的问题,经过一番额外的谷歌搜索后,发现它已在两年前得到回答 here

    问题在于浏览器设置,我想现在大多数人都在使用:“当 Firefox 启动时,显示我上次的窗口和选项卡”或“启动时,从上次中断的地方继续”。这个问题现在在教程中作为脚注提到(Chapter 8, Note 1),但作者最好的说法是

    ...Rails 当然无法控制这种行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      相关资源
      最近更新 更多