Rails会话在浏览器关闭时不会过期

时间:2018-01-10 03:59:22

标签: ruby-on-rails session cookies

我理解Rails的默认行为,在存储会话时,例如session[:id] = 1,它将id保存到cookie,当用户关闭浏览器窗口时,cookie将过期。但是,在我的应用程序中,当我关闭(退出)浏览器并重新启动它时,浏览器仍然“记得”我正在登录。这是我的控制器代码:

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:email])
    if user && user.authenticate(params[:password])
      log_in user
      redirect_to user
    else
      flash.now[:notice] = "Invald email / password combination"
      render 'new'
    end
  end

  def destroy
  end
end

和我的帮助文件:

module SessionsHelper

  def log_in(user)
    session[:user_id] = user.id
  end

  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
  end

  def logged_in?
    !current_user.nil?
  end

  def user_name
    @current_user.first_name ? (@current_user.first_name + " ") : nil
  end

end

我在应用程序控制器中没有任何内容,也没有弄乱有关会话的初始化程序或配置文件。什么可能导致我的会话持续存在而不会使cookie过期?

2 个答案:

答案 0 :(得分:0)

使用config/initializers/session_store.rb文件添加

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

而不是

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

请查看here了解详情。

答案 1 :(得分:0)

解决方案是简单地关闭cookie或重置cookie,这会导致每次访问都会创建一个新会话。解决方案看起来像这样:

  • 在客户端,编写一个beforeunload事件处理程序。
  • 从你的处理程序发出一个AJAX请求来注销URL,就你的情况而言 可能是删除cookie的特殊视图(请参阅Rails文档 饼干)。
  • AJAX请求必须是同步的,以确保beforeunload 事件处理程序等待它的完成。

参考此https://codedecoder.wordpress.com/2013/12/04/clear-session-or-cookie-browser-close-ruby-jquery/它可能也有帮助