因为我使用javascript来执行操作而不是控制器方法,所以我需要检查用户是否在呈现该操作之前已超时。为此,我尝试在我的application_controller.rb中添加和删除cookie,如下所示:
Warden::Manager.after_set_user do |user,auth,opts|
auth.cookies[:signed_in] = 1
end
Warden::Manager.before_logout do |user,auth,opts|
auth.cookies.delete :signed_in
end
并在我的javascript文件中:
myCookie = getCookie("signed_in");
if (myCookie == null)
{
//redirect to sign in page
} else {
//perform my action
}
function getCookie(name) {
var dc = document.cookie;
var prefix = name + "=";
var begin = dc.indexOf("; " + prefix);
if (begin == -1) {
begin = dc.indexOf(prefix);
if (begin != 0) return null;
}
else
{
begin += 2;
var end = document.cookie.indexOf(";", begin);
if (end == -1) {
end = dc.length;
}
}
return decodeURI(dc.substring(begin + prefix.length, end));
}
但是,这似乎不适用于会话超时,仅适用于注销。我已经看到了几种方法来实现这一目标,但是我似乎无法直接从Devise或Warden中找到任何东西来使用或覆盖一种方法来测试用户是否已经超时或者如果用户已经被采取行动时间到。我在Rails 5和Devise 4.2.1上。
答案 0 :(得分:0)
您需要向服务器发出请求以查看用户是否有超时时间,因为当您设置超时时,即服务器端,因此当此时间过去时客户端没有变化,要知道的唯一方法是向服务器发出ajax请求,以查看会话timedout user.timedout?(Time.now.utc)
或直接对动作请求进行验证(在控制器中),用户将始终尝试运行该操作,但在服务器上,您验证用户是否有超时时间,然后您不允许他们这样做并重定向到登录页面。