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