我们有一个需要登录的内部ASP.NET MVC应用程序。登录效果很好,并且做了预期的事情。我们的会议将在15分钟内结束。在一个页面上停留了一段时间后,用户失去了会话。如果他们试图刷新当前页面或浏览到另一个页面,他们将获得一个登录页面。我们保存他们的请求,以便他们登录后可以继续访问他们请求的页面。这很有效
然而,我的问题是,在某些页面上存在AJAX调用。例如,他们可能会填写表单的一部分,然后离开,让他们的会话过期。当他们回来时,屏幕仍然显示。如果他们只是填写一个框(这将进行AJAX调用),AJAX调用将返回登录页面(在AJAX应该返回实际结果的任何div中)。这看起来很可怕
我认为解决方案是使页面本身过期(这样当会话终止时,它们会自动返回到登录屏幕,而无需任何操作)。然而,我想知道是否有关于如何最好地实现这一点的意见/想法,特别是关于ASP.NET MVC中的最佳实践
更新:
因此,我继续在我的OnActionExecuting中实现了这一点(根据Keltex的建议)
如果(!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
if(filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.Write(“无效会话--请登录!”);
filterContext.HttpContext.Response.End();
}
其他的
{
...
}
}
这肯定会让事情变得更好——现在,即使他们有两个选项卡(一个带有一些可以触发的AJAX调用),并且在第二个选项卡中显式注销,他们也会立即得到更有意义的东西,而不是一堆乱七八糟的AJAX数据
我仍然认为我将实现womp建议的Javascript倒计时
具体来说,我不知道有没有关于它的最佳实践,但我现在正在为我们的应用程序做这件事。我们选择了客户端解决方案,将会话超时值输出到母版页中的一些javascript中,并计算会话何时过期
在开始前5分钟,我们弹出一个模式对话框,说“你还在吗?”并带有倒计时。一旦计时器达到0:00,我们将浏览器重定向到登录页面
它使用最少的javascript来执行时间和计时器计算,以及一个简单的.ashx处理程序来实现,如果用户在会话到期前单击对话框上的“我回来了”,该处理程序将刷新会话。这样,如果他们及时返回,就可以刷新会话而无需任何导航