猿问

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

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

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

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


慕尼黑的夜晚无繁华
浏览 1804回答 4
4回答

qq_花开花谢_0

我解决了这个问题:向响应添加自定义标头: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 Library供应商来说是一个非常令人头疼的问题。在Ra-Ajax中,我们被迫使用HTTP响应状态代码278(只是一些“未使用的”成功代码)来处理来自服务器的透明重定向...这真让我烦恼,如果有人在W3C有一些“拉”,我会很高兴你能让W3C 知道我们真的需要自己处理301和302代码......!;)

富国沪深

最终实现的解决方案是使用包装器来执行Ajax调用的回调函数,并在此包装器中检查返回的HTML块上是否存在特定元素。如果找到该元素,则包装器执行重定向。如果没有,则包装器将调用转发给实际的回调函数。例如,我们的包装函数类似于:function cbWrapper(data, funct){     if($("#myForm", data).length > 0)         top.location.href="login.htm";//redirection     else         funct(data);}然后,在进行Ajax调用时,我们使用了类似的东西:$.post("myAjaxHandler",         {         param1: foo,         param2: bar       },        function(data){            cbWrapper(data, myActualCB);        },         "html");这对我们有用,因为所有Ajax调用总是在我们用来替换页面的DIV元素中返回HTML。此外,我们只需要重定向到登录页面。
随时随地看视频慕课网APP
我要回答