如何在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。 我发现这种方法要好得多。


我解决了这个问题:

  • 将自定义标题添加到响应中:

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

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

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

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

    链接地址: http://www.djcxy.com/p/201.html

    上一篇: How to manage a redirect request after a jQuery Ajax call

    下一篇: What exactly is RESTful programming?