如何在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