协慌网

登录 贡献 社区

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

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

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

答案

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

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

我遇到了类似的问题。我执行一个有两个可能响应的 ajax 请求:一个将浏览器重定向到一个新页面,另一个用新的替换当前页面上的现有 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.redirect 和 data.form。我发现这种方法要好得多。

我解决了这个问题:

  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 = '/';
        }
    });

没有浏览器正确处理 301 和 302 响应。事实上,该标准甚至表示他们应该 “透明地” 处理它们,这对于 Ajax Library 供应商来说是一个非常令人头痛的问题。在Ra-Ajax 中,我们被迫使用 HTTP 响应状态代码 278(只是一些 “未使用的” 成功代码)来处理来自服务器的透明重定向...

这真让我烦恼,如果有人在 W3C 中有一些 “拉”,我会很高兴你能让 W3C 知道我们真的需要自己处理 301 和 302 代码......! ;)