Session 在Rails中,浏览器关闭时如何销毁会话?

Session 在Rails中,浏览器关闭时如何销毁会话?,session,railstutorial.org,Session,Railstutorial.org,我正在看迈克尔·哈特尔的《铁路结构》,我被困在练习9.6.2中。我在线搜索并在我的会话助手中使用了以下代码: module SessionsHelper def sign_in(user) session[:user_id] = user.id self.current_user = user end def current_user=(user) @current_user = user end def current_user @c

我正在看迈克尔·哈特尔的《铁路结构》,我被困在练习9.6.2中。我在线搜索并在我的会话助手中使用了以下代码:

module SessionsHelper

  def sign_in(user)

    session[:user_id] = user.id
    self.current_user = user
  end

  def current_user=(user)
    @current_user = user
  end

  def current_user
    @current_user ||= User.find(session[:user_id]) if session[:user_id]
  end

  def signed_in?
    !current_user.nil?
  end

  def sign_out
    session[:user_id] = nil
    self.current_user = nil
  end
end
我在网上找到的:

但是,当浏览器关闭时,用户不会注销。还有其他人能解决这个问题吗

编辑: 看着你提供的链接,他们写道:

我们还可以启动服务器(使用“$rails s”)并验证 没有cookies的全新会话功能(我们应该 每次关闭浏览器时注销)

(增加重点)

因此,他们的解决方案是简单地关闭cookies,这将导致每次访问都创建一个新会话。他们实际上并不是在讨论删除服务器端的旧会话

以下是我的原始答案,仅供参考:


(抱歉,如果这太笼统了,我想你没有看到更大的图景)

从根本上说,web使用一种基于拉的模型——客户机请求在服务器上执行操作

您不能“强制”客户端关闭会话,因为关闭会话是客户端必须从服务器请求的操作(例如:通过注销)

因此,会话通常有一个定期检查的超时周期。每个会话都有一个“开始时间”存储在数据库中,太旧的会话将被清除

这就是说,javascript中可能有某种方法可以检测浏览器关闭事件,并尽最大努力尝试关闭会话。但不能保证——用户总是可以强制终止浏览器进程,让服务器完全处于黑暗中


简而言之,您不能依靠客户端来关闭会话。超时可能是最好的选择。

第一件事是清除正在使用的会话存储,以避免“混淆”。 我猜这个练习使用的是默认(cookie)存储,但当然您可能已经将其更改为活动记录存储(或将数据保存在服务器上的任何其他存储)

检查您的
config/initializers/session_store.rb
文件以查找正在使用的会话存储。 假设您没有更改有关存储的任何内容,则应将其配置为
:cookie\u store
,在这种情况下,您无需担心任何问题,因为客户端cookie用于存储会话数据,并且这些cookie在浏览器关闭后默认过期(它们称为“会话”)cookie,只是为了澄清,这里的会话指的是在您的浏览会话持续之前存在的cookie(关闭浏览器会删除会话cookie)。 当然,这并不调用任何服务器端代码,例如“代码>符号Simule或<代码>会话。在浏览器退出时销毁< /代码>,但是当cookie持有所有会话数据并被浏览器删除时,您就不能再访问它,因此可能会考虑会话被破坏……/P> 现在,对于服务器端会话存储,这变得更加复杂,正如前面的回答中所提到的“您不能‘强制’客户端关闭会话”。
大多数人所做的是手工销毁“过期”会话,例如。rake任务示例

我现在正在阅读这本很棒的教程,大约30分钟前我完成了同样的任务。 杰里米·罗曼准确地回答了这条线索中的问题。虽然他没有提供一个循序渐进的答案,但他提到的事情让我能够找到答案

现在更具体地说。。。考虑到Jeremy提到的浏览器关闭后会话自动过期的问题,除非为相应的cookie指定了“Expires”属性,否则解决方案与以下代码块相关:

app/helpers/session\u helper.rb:

def登录(用户)
cookies.permanent.signed[:memory_token]=[user.id,user.salt]
self.current_user=用户
结束
根据,上面的
permanent
方法将'Expires'cookie属性设置为
20.years.from\u now
。因此,这意味着您的会话将持续20年,除非您明确注销或删除cookie

因此,为了在浏览器关闭时使会话过期,您只需要创建没有任何过期日期的cookie,这归结为简单地省略
永久性

app/helpers/session\u helper.rb:

def登录(用户)
cookies.signed[:记住令牌]=[user.id,user.salt]
self.current_user=用户
结束

虽然可能还有其他有效的解决方案,但对我来说还不明显(毕竟我刚刚开始学习Rails),但这一个看起来非常简单——你甚至不需要写任何东西——只要删除
永久性的
,就可以了!:)

在阅读教程时,我被困在同一个练习中。如果您碰巧使用Firefox并决定保存选项卡,然后退出,那么当您重新启动浏览器时,浏览器显然会保存您的所有会话数据。这意味着保存在会话cookie中的用户信息也将被恢复,因此用户在浏览器关闭后似乎已登录。我不认为其他浏览器(例如chrome)有同样的行为。因此,一个快速的测试是使用另一个浏览器,看看你的代码是否有效。希望这能有所帮助。

我知道这个答案迟了四年多一点,但我自己也遇到了同样的问题,而且在这期间,人们以各种形式多次询问这个问题。我找到的唯一正确答案是

问题不在于设计问题。当然,我们希望在打开cookie的情况下完成此练习。相反,问题在于浏览器设置:在启动浏览器时“继续您离开的位置”或“打开上次的窗口和选项卡”。这个设置是k