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

时间:2015-03-06 17:20:26

标签: javascript ruby-on-rails ruby ruby-on-rails-3 session

早上好!

我们正在为我们的应用程序实现会话控制,我们需要在会话到期时自动重新加载页面以进入登录页面或显示模式或弹出窗口以使用户知道会话已过期并将用户带到登录页面,我们已经尝试了很多选择来实现它,但任何事情都适合我们。

这是我们的背景:

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的:

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"])

respond_to:

对于此测试,我们在 / 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

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

问候!

1 个答案:

答案 0 :(得分:1)

对于我所理解的内容,您必须在任何带有过期会话的ajax请求之后实施一些机制来重定向到登录页面。

我会开始为JSON提供respond_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();
    }
  }
});

我还没有对此进行测试,因此您可能需要进行一些调整。