【问题标题】:How to trigger action when rails session expires?Rails会话到期时如何触发操作?
【发布时间】:2018-09-20 22:21:23
【问题描述】:

我有一个用户可以登录到我的 Ruby on Rails 应用程序。我自己用会话控制器编写了这些函数。我还在 session_store.rb 中设置了会话到期的时间。

这一切都很好,但另外我想跟踪用户何时登录或注销。现在我可以跟踪用户手动完成的登录和注销。但是当会话到期时,我的“sessions#destroy”选项不会被触发,因此没有设置注销时间。

当会话过期或会话被 Rails 杀死时,是否有可能触发操作?

谢谢!

更新:

对不起,我应该包含一些我的代码:

app/controllers/sessions_controller.rb
class SessionsController < ApplicationController

  def new
    if !current_user.nil?
      redirect_to start_path
    end
  end

  def create
    user = User.find_by_username(params[:username])
    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      UserTracing.create(user_id: user.id, sign_in_at: DateTime.now)
      redirect_to start_path, notice: I18n.t("text logged_in")
    else
      flash.now.alert = I18n.t("error username_or_password_invalid")
      render "new"
    end
  end

  def destroy
    @id = current_user.id
    session[:user_id] = nil
    UserTracing.where(user_id: @id).order(sign_in_at: :asc).last.update_attributes(sign_out_at: DateTime.now)
    redirect_to root_url, notice: I18n.t("text logged_out")
  end
end

【问题讨论】:

  • 您如何存储会话?我不知道是否完全有可能在他们的会话到期时没有向服务器发出请求。例如,如果会话存储在 cookie 中,那是浏览器的东西,没有请求,因此没有真正的方法来跟踪它。你可能不得不做一个 chrome 扩展来做到这一点。但我不完全确定。
  • 感谢您的关注。我添加了会话控制器的代码以阐明如何创建和删除会话。
  • 如果您使用 cookie 会话存储(这是默认设置),那么您无法知道会话何时到期。事实上,只要网站访问者碰巧退出浏览器,它就会立即过期,因此您不可能知道。
  • 是的,所以看起来您正在为会话使用 cookie 存储。我认为无法跟踪它何时过期。

标签: ruby-on-rails ruby session ruby-on-rails-4


【解决方案1】:

这很容易。

你所要做的就是使用你的会话助手方法来

  1. 创建会话设置为过期的时间 session[:expires_at] = Time.now + minutes_to_run * 60
  2. 创建一个检索此时间的函数。
  3. 在加载此页面之前在控制器中运行一个函数,以检查当前时间是否大于会话设置为过期的时间。该解决方案使用 javascript setTimeout() 来确保刷新页面,否则您将不得不等待用户重新加载。这样,您的应用程序就会刷新页面。

这是一篇详细介绍此想法的博文。 https://medium.com/@thatlovelypract/rubyonrails-timed-session-a5de0cf70f3b

【讨论】:

  • 链接页面已不存在
猜你喜欢
  • 2015-01-24
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多