使用JQuery的MVC:处理会话过期

我如何处理在某些页面上具有JQuery Ajax方法调用的MVC应用程序的会话到期。 问题如下:

  • 当客户端达到会话超时时,我的每个控制器都会inheritance一个类,该类检查会话是否处于活动状态(查看某些内容,如站点会话,数据库会话等),并将客户端重定向到新页面,说明该会话到期; 但是当我使用JQuery ajax在某些按钮点击时调用控制器的方法时,情况就不同了,因为它会跳过inheritance类的validation并允许我留在页面上,但是当控制器试图结束执行时方法,显然它会抛出.Net错误:对象不是作为对象的实例创建的,没有找到会话变量等等都是因为因为异步方法调用而未处理的过期会话。

我怎么能处理这种行为,哪种是处理它的最佳方法(尽可能多地尝试不修改应用程序代码的这么多部分)?

提前致谢。

PD :告诉我使用Jquery的$.post()可能很有用。

这通常是一个不可恢复的错误,通常最好显示为独立的错误页面。 配置webapplication以显示自定义的4nn/5nn错误页面并设置jQuery,如下所示:

 $(document).ready(function() { $.ajaxSetup({ error: handleXhrError }); }); function handleXhrError(xhr) { document.open(); document.write(xhr.responseText); document.close(); } 

这样,服务器端4nn/5nn错误页面将显示为由同步请求引起。 我之前发过关于这个主题的简短主题 。

另一种方法是ajaxically推迟会话超时。 使用setInterval()每次会话到期时减去十秒左右,向服务器发出一个轮询请求(进而基本上从请求中抓取会话)。

 setInterval(function() { $.get('poll'); }, intervalInMillis); 

但需要注意的是,只要客户端的浏览器窗口打开,会话就会存在,这有时可能需要长时间。 如有必要,您可以将其与各种活动检查器结合使用,以便最大限度地减少会话过期的可能性。 你仍然需要将它与一个像样的4nn/5nnerror handling程序结合起来。

 $(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'; } }