我的问题是这个。
当用户打开两个标签并转到需要身份验证的同一页面时,一切正常。如果那时他登出标签,他显然会被重定向到登录页面,而不是在另一个标签上。这仍然是正常的。
但是,页面上有一些使用javascript的函数,如果用户尝试使用javascript,则无法执行该操作,并且呈现的“sign_in.json”包含设计错误消息“unauthenticated” 。发送此消息后,我需要将用户重定向到登录表单。我该怎么做?
答案 0 :(得分:0)
听起来你使用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/
答案 1 :(得分:0)
@jokklan
你的帖子非常有帮助,我确实改变了全局ajax设置,似乎工作正常。还必须发送401代码的回复。
我通过自定义Devise::FailureApp
def respond
# ...
elsif request.xhr?
redirect_to some_path, status: 401
end
# ...
end
由于控制器响应json,重定向也发生在json中,但是通过将状态设置为401,我能够捕获并将用户重定向到我需要的路径ajaxSetup
不是最漂亮的,但我愿意接受更好的建议。