解决方案 1:保持会话有效
解决您的问题的方法是在打开表单时保持会话处于活动状态。我确信有很多方法可以“保持活跃”用户的会话。对我来说,我使用通用处理程序,至少在我的要求中可以正常工作。
首先,创建一个通用处理程序并输入如下代码:
Public Class KeepSessionAlive
Implements IHttpHandler, IRequiresSessionState
Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Session("KeepSessionAlive") = DateTime.Now
End Sub
ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
确保您的通用处理程序类实现IRequiresSessionState 如上所述。
然后在您的表单页面中,使用jQuery.post 以您选择的时间间隔发布请求上述处理程序。例如:
<script type="text/javascript">
$(function () {
setInterval(function () { $.post('<%= ResolveClientUrl("~/KeepSessionAlive.ashx")%>'); }, 10000); ' 10 secs interval
});
</script>
当用户在表单上时,POST 请求会像正常的页面请求一样不断刷新用户的会话,因此 IIS 将继续重置会话超时。
解决方案 2:超时前提醒用户
另一种方法是在会话即将结束时提醒用户。这可以通过单独使用纯 javascript 来实现。几年前我使用过这种方法,所以请原谅我的脚本。
创建一个javascript方法:
function sessionTimeout(n) {
setTimeout("alertSessionTimeout()", (n - 1) * 60 * 1000);
}
function alertSessionTimeout() {
var answer = confirm("Your session is about to expire in 1 minute.\n\n
Click 'OK' to extend your session.\n
Click 'Cancel' to terminate you session immediately.");
if (answer == true)
window.location = location.href;
else {
window.top.location = 'logout.aspx';
}
}
在您的表单页面上,只需在您的正文标签上输入 onload 脚本:
<body onload="sessionTimeout(<%=session.Timeout %>)">
因此,如果您的超时设置为 10 分钟,用户将在第 9 分钟收到提醒。当然,您可能希望在用户单击“确定”按钮时更改代码。我上面的代码将刷新页面,这绝对不是您想要做的,否则,用户的数据将会丢失。您可以使用上述解决方案 1 中的通用处理程序来重置会话并再次调用 sessionTimeout 以重置客户端超时倒计时。