gpt4 book ai didi

javascript - 使用 Ruby on Rails session 过期时如何重新加载或刷新页面

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:51 24 4
gpt4 key购买 nike

早上好!

我们正在为我们的应用程序实现 session 控制,我们需要在 session 过期时自动重新加载页面以转到登录页面,或者显示模式或弹出窗口让用户知道 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 和我们的登录功能 Controller ,但它只是在后台执行,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)

尽管消息告诉我们 View 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

有什么建议吗?或者我们应该做什么?我们将感谢您的帮助

您好!

最佳答案

据我了解,您必须实现某种机制以在任何带有过期 session 的 ajax 请求后重定向到登录页面。

我会开始使用 JSON 的 respond_to 版本并让客户端知道 session 已过期。

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();
}
}
});

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

关于javascript - 使用 Ruby on Rails session 过期时如何重新加载或刷新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28904150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com