我的问题是这个。
当用户打开两个选项卡并转到需要身份验证的同一页面时,一切都很好。如果然后他在选项卡上注销,他显然会被重定向到登录页面,而不是在另一个选项卡上。这仍然是正常的。
但是,页面上有一些使用 javascript 的功能,如果用户尝试使用它们,他将无法执行操作,并且呈现的“sign_in.json”包含设计错误消息“未经身份验证”。发送此消息后,我需要重定向用户以登录表单。我怎么做?
我的问题是这个。
当用户打开两个选项卡并转到需要身份验证的同一页面时,一切都很好。如果然后他在选项卡上注销,他显然会被重定向到登录页面,而不是在另一个选项卡上。这仍然是正常的。
但是,页面上有一些使用 javascript 的功能,如果用户尝试使用它们,他将无法执行操作,并且呈现的“sign_in.json”包含设计错误消息“未经身份验证”。发送此消息后,我需要重定向用户以登录表单。我怎么做?
听起来您使用 javascript 向您的服务器发出 ajax 请求,该服务器以 401 和一些 json 数据响应,对吗?如果你使用 jQuery,你可以做这样的事情:
# Your ajax call
$.ajax({
...
statusCode: {
401: function() {
# Redirect to login
window.location.replace("http://yoursite.com/login_page");
}
}
});
您可以使用 ajaxSetup 来全局更改 jQuery 中所有 ajax 请求的此行为,如下所示:
$.ajaxSetup({
statusCode: {
401: function() {
# Redirect to login
window.location.replace("http://yoursite.com/login_page");
}
}
});
然而,jQuery 文档强烈建议反对这种方法,因为这可能会破坏其他插件等的预期行为。我个人认为在这个例子中它会很好,只要确定你做了什么并测试一切都按预期工作。你可以在这里阅读更多:http: //api.jquery.com/jQuery.ajaxSetup/
@jokklan
您的帖子非常有帮助,我确实更改了全局 ajax 设置,似乎工作正常。也只需要发送带有 401 代码的响应。
我通过自定义来管理Devise::FailureApp
def respond
# ...
elsif request.xhr?
redirect_to some_path, status: 401
end
# ...
end
由于控制器响应 json,重定向也发生在 json 中,但是通过将状态设置为 401,我能够捕捉到它并将用户重定向到我需要的路径ajaxSetup
不是最漂亮的,但我愿意接受关于让它变得更好的建议。