0

我的问题是这个。

当用户打开两个选项卡并转到需要身份验证的同一页面时,一切都很好。如果然后他在选项卡上注销,他显然会被重定向到登录页面,而不是在另一个选项卡上。这仍然是正常的。

但是,页面上有一些使用 javascript 的功能,如果用户尝试使用它们,他将无法执行操作,并且呈现的“sign_in.json”包含设计错误消息“未经身份验证”。发送此消息后,我需要重定向用户以登录表单。我怎么做?

4

2 回答 2

0

听起来您使用 javascript 向您的服务器发出 ajax 请求,该服务器以 401 和一些 json 数据响应,对吗?如果你使用 jQuery,你可以做这样的事情:

# Your ajax call
$.ajax({
  ...
  statusCode: {
    401: function() {
      # Redirect to login
      window.location.replace("http://yoursite.com/login_page");
    }
  }
});

编辑:全局ajax设置

您可以使用 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/

于 2013-06-16T14:42:20.220 回答
0

@jokklan

您的帖子非常有帮助,我确实更改了全局 ajax 设置,似乎工作正常。也只需要发送带有 401 代码的响应。

我通过自定义来管理Devise::FailureApp

def respond
  # ...
  elsif request.xhr?
    redirect_to some_path, status: 401
  end
  # ...
end

由于控制器响应 json,重定向也发生在 json 中,但是通过将状态设置为 401,我能够捕捉到它并将用户重定向到我需要的路径ajaxSetup

不是最漂亮的,但我愿意接受关于让它变得更好的建议。

于 2013-06-19T08:09:16.170 回答