我们有一个内部ASP.NET MVC应用程序,需要登录。登录效果很好,并且可以完成预期的工作。会话的有效期为15分钟。在该页面上坐了一段时间后,用户丢失了会话。如果他们尝试刷新当前页面或浏览到另一个页面,他们将获得登录页面。我们会将他们的请求存储起来,以便他们登录后可以继续进入他们请求的页面。这很好。
但是,我的问题是,在某些页面上有AJAX调用。例如,他们可以填写表格的一部分,徘徊并让其会话过期。当他们回来时,仍然显示屏幕。如果他们只是填写一个框(将进行AJAX调用),则AJAX调用将返回登录页面(在AJAX应该仅返回实际结果的div内)。这看起来太可怕了。
我认为解决方案是使页面本身过期(这样,当会话终止时,它们将自动返回登录屏幕,而无需任何操作)。但是,我想知道是否有关于如何最好地在ASP.NET MVC中的最佳实践方面最好地实现这一点的意见/想法。
更新:
所以我继续按照我OnActionExecuting的建议(根据Keltex的建议)实施了
OnActionExecuting
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数据。
我仍然认为我也将实现womp建议的Java倒计时。
具体来说,我不知道有任何最佳实践,但是我现在正在为我们的应用程序执行此操作。我们选择了一种客户端解决方案,在该解决方案中,我们将会话超时值输出到母版页中的某些javascript中,并计算会话何时到期。
提前5分钟,我们弹出一个模态对话框,显示“您还在吗?” 带有倒数计时器 计时器到达0:00后,我们会将浏览器重定向到登录页面。
它使用最少的javascript进行时间和计时器计算,并且使用简单的.ashx处理程序实现,如果用户单击“我回来了”,该处理程序将刷新会话。会话到期前,请在对话框中单击。这样,如果他们及时返回,则无需任何导航即可刷新会话。