1

我有一个用经典 ASP 编写的 Intranet 应用程序。

每当用户处于非活动状态的时间超过会话时间时,我希望他们所在的页面重新加载,这会将他们重定向回登录页面,因为会话变量将为空。

我尝试了一堆解决方案,但似乎没有一个在所有浏览器中都能可靠地工作。

IE 给我带来的问题最多也就不足为奇了。

无论如何,在我的登录脚本中,我将会话超时设置为:

Session.Timeout = 15

我尝试使用元刷新标签,但在 IE(所有版本)中有时它会工作,有时它不会,我不知道为什么。我会采取会话超时并添加一秒钟,如下所示:

<meta http-equiv="refresh" content="<% = CInt(Session.Timeout + 1) * 60  %>;url=/?timeout=true" />

有时 IE 会进行刷新,而其他时候它会坐在那里。我知道会话超时,因为当浏览器不执行刷新时,如果我点击刷新,我会被定向到登录页面。

元刷新和我缺少的 IE 有什么奇怪的地方吗?

我尝试的第二种方法是使用 JavaScript。由于需要为 Intranet 应用程序启用 JavaScript,这似乎是我实现的一个不错的选择:

<% iTimeout = CInt((Session.Timeout * 60) + 1) * 1000 %>
<script>window_refresh = window.setTimeout(function(){window.location.href=window.location.href+"?timeout=true"},<% = iTimeout %>);</script>

现在这可靠地重新加载了页面,但似乎服务器上的计时器和浏览器中使用的 JavaScript 计时器已关闭,因为有时重新加载页面时,会话仍然有效。

我尝试将 + 1 更改为 +60 并且大部分时间都有效,但即便如此,有时页面会在会话仍然有效时刷新。

我是否正确处理了这个问题?

4

1 回答 1

2

我肯定也会通过 JavaScript 来解决这个问题。

但是,我不会将用户重定向回登录页面,而是创建某种每隔几分钟运行一次的 keepalive 脚本,以确保如果用户仍然在浏览器中打开页面,会话永远不会超时。
如果在您的情况下由于某种原因这不是一个可用的解决方案,我至少会记住提醒用户重定向即将发生,以避免突然的重定向完全让用户感到惊讶。

无论如何..回答你的问题:

您的页面是否还加载其他资源,如图像、样式表和其他内容?

像这样的文件是在处理 HTML 之后加载的,如果 JavaScript 超时在最后一个文件加载之前启动,您最终可能会遇到 JavaScript 超时在会话超时启动之前启动的情况。

在这种情况下,JavaScript 超时将在会话超时之前触发,这使得重定向发生在会话超时之前。

您说您已尝试将额外秒数增加到 60 秒,但有时仍会出现问题。您确定在 JavaScript 超时启动后没有加载任何文件吗?我会对此进行一些调查,因为这听起来像是重置了系统中的会话超时。

于 2013-09-17T20:09:11.503 回答