【问题标题】:MVC with JQuery: handling Session Expire带有 JQuery 的 MVC:处理会话过期
【发布时间】:2011-01-20 02:43:30
【问题描述】:

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

  • 当客户端达到会话超时时,我的每个控制器都会继承一个类来检查会话是否处于活动状态(查找站点会话、数据库会话等内容)并将客户端重定向到新页面会话到期;但是当我使用 JQuery ajax 在某些按钮单击时调用控制器的方法时情况有所不同,因为它会跳过继承类的验证并允许我留在页面上,但是当控制器尝试结束执行时的方法,显然它会引发 .Net 错误:对象未创建为对象的实例,未找到会话变量等。所有这些都是由于异步方法调用而未处理的过期会话。

我该如何处理这种行为,哪种是最好的处理方式(尽量不修改应用程序的这么多部分代码)?

提前致谢。

PD:告诉我我正在使用来自 Jquery 的 $.post() 可能会很有用。

【问题讨论】:

    标签: jquery asp.net-mvc error-handling


    【解决方案1】:

    这通常是一个不可恢复的错误,通常最好显示为独立的错误页面。配置 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';
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2012-11-30
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 2011-11-06
      • 2011-03-21
      • 1970-01-01
      相关资源
      最近更新 更多