2011-10-11 38 views
2

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

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

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

我该怎么做?

例如

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

回答

2

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

登录返回AJAX结果
而不是仅仅返回登录界面,返回消息表明会话已过期。如果您的AJAX收到这样的消息,它知道用户需要重新登录。在这一点上,你可以这样做

window.location = loginpageurlhere; 

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

显示对话框,如果用户处于非活动状态的时间太长
对于这一点,你需要知道用户是多长时间不活动。你可以通过几种不同的方式来做到这一点,其中之一如下:

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

你可以使用两种,这些方法,但如果您担心在无人值守的机器保护数据,第二种方法是最好的,因为你能挡住屏幕,只显示该对话框,它会在用户离开时发生,而第一种方法在用户实际尝试在您的页面上执行操作之前不能执行任何操作。

+0

谢谢;)我要去做倒计时。 – Cameron

+0

我喜欢处理这个(每Darin)的statusCode参数,但这只是一个偏好问题。检查成功返回的某种“不再认证”标志或字符串的数据也会起作用。我不会依靠倒计时;这只是一个假的会话,很容易被欺骗。您还需要处理真实的服务器会话。倒计时对于“你已经空闲”的对话可能没问题。 –

+0

@Greg同意。会话需要跟踪服务器端。看来OP已经这样做了,但是另外只是想在会话过期时通知用户,所以欺骗不应该是问题,因为服务器不知道用户是否认为它仍然被认证。 – yoozer8

2

你可以看看这说明一个很好的技术,让你在这种情况下,这可能在客户端被捕获,并采取相应的行动,服务器返回401状态码following blog post(显示模式来用户)。

+0

虽然这很好,但我更希望检测会话是否已过期,然后在全球范围内做某些事情,以便说用户已经离开了他们的屏幕,JS可以将重定向发送到另一个页面或显示模式。 – Cameron

+0

@Cameron,什么阻止你这样做?您可以为您的整个应用程序提供一个全局完整的AJAX处理程序,因此服务器通过您的任何AJAX调用返回的任何401状态代码将集中在一个可处理它们的函数中。在这个功能中,如果你检测到401状态码,你可以做任何你想要的:重定向,显示模式,... –

+0

同意;并拥有statusCode处理程序意味着您可以预测并处理其他服务器状态。例如,您的应用程序可能具有用户角色 - 对用户没有足够权限的请求发出403。 –

0

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

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

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