如果会话已过期,则处理AJAX请求

时间:2011-10-11 15:49:51

标签: jquery asp.net-mvc-3

在我的应用程序(ASP.NET MVC 3 RAZOR)中,当会话过期且用户尝试访问某些内容时,会将其重定向到登录页面以重新登录。

这很好,但是当从ajax请求调用时(例如,如果用户已经离开他们的屏幕一段时间没有活动),它将在ajax请求中加载登录表单...这不是我想要的发生。

处理此问题的最佳方法是什么?理想情况下,如果会话已过期,我想显示模式,以便用户无法访问其他区域。因此,即使他们离开屏幕,一些jQuery也会检查会话,然后应用一个模式说'Session Expired'

我该怎么做?

e.g。

if(SESSION HAS EXPIRED) { showModal(); }

3 个答案:

答案 0 :(得分:3)

我可以在这里看到两个单独的可寻址问题,因此我将分别讨论它们。

以AJAX结果返回登录
而不是只返回登录屏幕,返回一条消息,指示会话已过期。如果你的AJAX收到这样的消息,它知道用户需要重新登录。此时,你可以做类似的事情

window.location = loginpageurlhere;

或者,您可以检查您的AJAX响应,看它是否是预期的响应,或者它是否是登录页面。如果是登录页面,请使用上述建议。

如果用户长时间处于非活动状态,则显示对话框
为此,您需要知道用户处于非活动状态的时间。您可以通过几种不同的方式完成此操作,其中一种方法如下:

  • 加载页面时,初始化变量以用作倒计时。
  • 设置一个计时器,每次计时器耗尽时都会递减计数器,然后重新启动。
  • 如果计数器达到零,则显示对话框并让用户重新登录。
  • 每次发生有效活动(AJAX帖子或您可能拥有的任何其他活动)时,请重置计数器。

您可以使用这些方法中的任何一种,但如果您担心在无人值守的计算机上保护数据,第二种方法最好,因为您可以阻止屏幕并仅显示对话框,并且它会在用户离开,而第一种方法在用户实际尝试在您的页面上执行操作之前无法执行任何操作。

答案 1 :(得分:2)

您可以看一下following blog post,它说明了一种很好的技术,允许您让服务器返回401状态代码,在这种情况下可以在客户端捕获并采取相应的操作(显示模式为用户)。

答案 2 :(得分:2)

您可以在jQuery中设置一个全局错误处理程序,每次jQuery ajax捕获错误时都会调用该处理程序。如果会话超时,则抛出401错误。这可以被捕获并且用户被重定向到登录页面。

$( document ).ajaxError(function( event, jqxhr, settings, thrownError ) {
    if (jqxhr.status == 401) {
        window.location.replace("/login");
    }
});

应始终将全局错误处理程序添加到文档对象中。