如何处理在某些页面上具有JQuery Ajax方法调用的MVC应用程序的会话过期。问题如下:
我如何处理这种行为,哪种方法可以处理它(尽可能多地尝试不修改应用程序代码的这么多部分)?
提前致谢。
PD :告诉我使用Jquery的$.post()
可能会有用。
答案 0 :(得分:16)
这通常是一个不可恢复的错误,通常最好显示为独立的错误页面。配置Web应用程序以显示自定义的4nn/5nn
错误页面并设置jQuery,如下所示:
$(document).ready(function() {
$.ajaxSetup({
error: handleXhrError
});
});
function handleXhrError(xhr) {
document.open();
document.write(xhr.responseText);
document.close();
}
这样就会显示服务器端4nn/5nn
错误页面,就好像它是由同步请求引起的一样。我之前发过关于这个主题的simliar topic。
另一种方法是ajaxically推迟会话超时。使用setInterval()
每次会话到期 - 减去十秒左右时,向服务器发出一个轮询请求(进而基本上从请求中抓取会话)。
setInterval(function() { $.get('poll'); }, intervalInMillis);
但需要注意的是,只要客户端的浏览器窗口打开,会话就会存在,有时候太长。如有必要,您可以将此与活动检查程序结合使用,以便最大限度地减少会话过期的可能性。您仍然需要将它与一个体面的4nn/5nn
错误处理程序结合起来。
$(document).ready(function() {
$.active = false;
$('body').bind('click keypress', function() { $.active = true; });
checkActivity(1800000, 60000, 0); // timeout = 30 minutes, interval = 1 minute.
});
function checkActivity(timeout, interval, elapsed) {
if ($.active) {
elapsed = 0;
$.active = false;
$.get('poll'); // Let server code basically do a "get session from request".
}
if (elapsed < timeout) {
elapsed += interval;
setTimeout(function() {
checkActivity(timeout, interval, elapsed);
}, interval);
} else {
alert($.messages.timeout); // "You will be logged out" blah blah.
window.location = 'http://example.com/logout';
}
}