如何在Ruby on Rails会话过期时重新加载或刷新页面

How reload or refresh page when session has expired with Ruby on Rails

本文关键字:加载 刷新 新加载 Ruby on Rails 过期 会话      更新时间:2023-09-26

早上好!

我们正在为我们的应用程序实现会话控制,当会话到期时,我们需要自动重新加载页面以转到登录页面,或者显示模式或弹出窗口,让用户知道会话已经过期,并将用户带到登录页面,我们尝试了很多选项来实现它,但任何东西都对我们有效。

这是我们的背景:

application_controller.rb

before_filter :prepare_session
def prepare_session
 if !session[:expiry_time].nil? and session[:expiry_time] < Time.now
   # Session has expired. Clear the current session.
   deny_access 'Your session has timed out. Please log back in.'
 end
 # Assign a new expiry time, whether the session has expired or not.
 session[:expiry_time] = 1.minutes.from_now
 return true
end

session_helper.rb

def deny_access(msg = nil)
 msg ||= 'Please sign in to access this page.'
 flash[:notice] ||= msg
 redirect_to :controller => 'users', :action => 'login'
end

在flash消息之后的deny_access方法中,我们有redirect_to和我们的登录功能控制器,但它只是在后台完成的,ruby控制台会给我们这个日志

RubyMine日志

Redirected to http://localhost:3000/users/login
Filter chain halted as :prepare_session rendered or redirected
Completed 302 Found in 1ms (ActiveRecord: 0.0ms)

Started GET "/users/login" for 127.0.0.1 at 2015-03-06 11:28:06 -0500
Processing by UsersController#login as JSON
  Rendered users/login.html.erb within layouts/application (0.8ms)
Completed 200 OK in 1089ms (Views: 1087.4ms | ActiveRecord: 0.0ms)

尽管消息告诉我们视图users/login.html.erb已被重定向,但在我们手动重新加载页面之前,我们的应用程序中什么都没有发生,所以,这些都是我们尝试过的选项:

重定向到:

redirect_to :controller => 'users', :action => 'login'
redirect_to url_for(:controller => :users, :action => :login)
redirect_to 'users/login'
redirect_to :back
redirect_to root_url 
redirect_to(request.env["HTTP_REFERER"])

响应:

对于这个测试,我们在/views/users/中创建了一个redirect_to_login.js.erb文件,该文件包含一个window.location.reload(),但它从未到达该文件,因此,我们的页面从未重新加载

respond_to do |format|
  format.html{
    redirect_to 'users/login'
  }
  format.js {
    render 'users/redirect_to_login', :layout=>false
  }
end
respond_to do |format|
  format.html
  format.js {
    render nothing: true
  }
end
respond_to do |format|
  format.js {render inline: "location.reload();" }
end

有什么建议吗?或者我们该怎么办?我们将感谢的帮助

问候!

据我所知,您必须实现一些机制,以便在任何会话过期的ajax请求后重定向到登录页面。

我会开始有一个JSON的respons_to版本,并让客户端知道会话已经过期。

respond_to do |format|
  format.html {
    redirect_to 'users/login'
  }
  format.json {
    render json: {error: 'session_expired'}
  }
end

在客户端,您必须拦截这些错误。一个简单的方法是使用http://api.jquery.com/ajaxComplete(假设您使用的是jQuery)。

它看起来像这样:

$( document ).ajaxComplete(function( event, xhr, settings ) {
  if(settings.dataType == "json") {
    var data = $.parseJSON(xhr.responseText);
    if(data && data.error && data.error == 'session_expired') {
      window.location.reload();
    }
  }
});

我还没有测试过,所以你可能需要做一些调整。