我们有一个需要登录的内部ASP.NET MVC应用程序。登录工作很好,并做到了预期的。我们有15分钟的会话过期。在那段时间坐在单页上之后,用户已经失去了会话。如果他们尝试刷新当前页面或浏览到另一页面,他们将获得登录页面。我们保留他们的请求,所以一旦他们登录后,他们就可以继续访问他们请求的页面。这很好。ASP.NET MVC会话到期
但是,我的问题是,在一些页面上有AJAX调用。例如,他们可能填写表格的一部分,流浪并让他们的会话过期。当他们回来时,屏幕仍然显示。如果他们只是填写一个框(这将使AJAX调用),AJAX调用将返回登录页面(在AJAX应该返回实际结果的任何div内)。这看起来很可怕。
我认为解决方案是让页面本身过期(这样当会话终止时,它们会自动返回到登录屏幕而不需要任何操作)。但是,我想知道是否有意见/想法如何最好地实现这与ASP.NET MVC的最佳实践有关。
更新:
所以我继续在我的OnActionExecuting
(每Keltex的建议)
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.Write("Invalid session -- please login!");
filterContext.HttpContext.Response.End();
}
else
{
...
}
}
这无疑使事情变得更好的实现这一点 - 现在即使他们有两个选项卡(一个带有一些可以触发的AJAX调用),并且他们会在第二个选项卡中明确注销,他们会立即得到更有意义的东西,而不是一堆搞砸的AJAX数据。
我仍然认为我会执行JavaScript的倒计时以及womp建议。
@Andrew - 这是一个优雅的解决方案。无论如何,filterContext.HttpContext.Response.Redirect(“/ error/xxx”); (或其他)工作? – Keltex 2010-04-07 22:05:39
@Keltex:我可以按照你的建议将它移动到一个视图中 - 但在我的许多AJAX调用中,它们返回的是没有HTML的原始数据(如值列表),而在其他情况下,它们可能会返回整个表格式良好的数据。因此,对于原始数据的“最低公分母”可能效果最好。我会玩。 – 2010-04-07 23:00:17