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


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

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

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

提前致谢。

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


8898
2018-02-23 14:53


起源



答案:


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

$(document).ready(function() {
    $.ajaxSetup({
        error: handleXhrError
    });
});

function handleXhrError(xhr) {
    document.open();
    document.write(xhr.responseText);
    document.close();
}

这样服务器端 4nn/5nn 将显示错误页面,就好像它是由同步请求引起的。我发布了一个 simliar主题 以前关于这个问题。

另一种方法是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';
    }
}

16
2018-02-23 15:16



非常感谢你的回答。 - lidermin


答案:


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

$(document).ready(function() {
    $.ajaxSetup({
        error: handleXhrError
    });
});

function handleXhrError(xhr) {
    document.open();
    document.write(xhr.responseText);
    document.close();
}

这样服务器端 4nn/5nn 将显示错误页面,就好像它是由同步请求引起的。我发布了一个 simliar主题 以前关于这个问题。

另一种方法是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';
    }
}

16
2018-02-23 15:16



非常感谢你的回答。 - lidermin