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

Cam*_*ron 4 jquery asp.net-mvc-3

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

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

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

我该怎么做?

例如

if(SESSION HAS EXPIRED) { showModal(); }
Run Code Online (Sandbox Code Playgroud)

oma*_*ari 5

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

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

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


yoo*_*er8 4

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

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

window.location = loginpageurlhere;
Run Code Online (Sandbox Code Playgroud)

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

如果用户不活动时间过长,则显示对话框
为此,您需要知道用户不活动的时间有多长。您可以通过几种不同的方式来执行此操作,其中之一如下:

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

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