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

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

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

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

我该怎么办?

例如

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

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

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

 window.location = loginpageurlhere; 

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

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

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

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

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

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

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

应始终将全局error handling程序添加到文档对象中。