如何在 jQuery Ajax 调用后管理重定向请求

2022-08-29 21:59:22

我使用Ajax调用servlet,然后使用生成的HTML片段来替换用户当前页面中的元素。但是,如果会话超时,服务器将发送重定向指令以将用户发送到登录页。在这种情况下,jQuery正在用登录页面的内容替换元素,迫使用户的眼睛目睹了一个罕见的场景。$.post()divdiv

如何使用jQuery 1.2.6管理来自Ajax调用的重定向指令?


答案 1

我阅读了这个问题,并实现了关于将响应HTTP状态代码设置为278的方法,以避免浏览器透明地处理重定向。尽管这有效,但我有点不满意,因为它有点黑客攻击。

经过进一步的挖掘,我放弃了这种方法,并使用了JSON。在这种情况下,对 AJAX 请求的所有响应都具有状态代码 200,并且响应的正文包含在服务器上构造的 JSON 对象。然后,客户端上的 JavaScript 可以使用 JSON 对象来决定它需要做什么。

我有一个和你类似的问题。我执行一个AJAX请求,该请求具有2个可能的响应:一个将浏览器重定向到新页面,另一个将当前页面上的现有HTML表单替换为新表单。用于执行此操作的 jQuery 代码如下所示:

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        } else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

JSON 对象“data”在服务器上构造为具有 2 个成员:和 。我发现这种方法要好得多。data.redirectdata.form


答案 2

我通过以下方式解决了这个问题:

  1. 将自定义标头添加到响应:

    public ActionResult Index(){
        if (!HttpContext.User.Identity.IsAuthenticated)
        {
            HttpContext.Response.AddHeader("REQUIRES_AUTH","1");
        }
        return View();
    }
    
  2. 将 JavaScript 函数绑定到 ajaxSuccess 事件,并检查标头是否存在:

    $(document).ajaxSuccess(function(event, request, settings) {
        if (request.getResponseHeader('REQUIRES_AUTH') === '1') {
           window.location = '/';
        }
    });