使用 ASP.NET VB 和/或 JavaScript 如何防止用户在会话过期时丢失表单数据?
问题
目前,当用户填写表格数据的时间超过会话超时期限时,由于会话到期,所有表格数据都会在帖子中丢失。
客户端操作,例如输入不要重置会话超时期限。
观
我想知道防止此问题发生的方法。
我最初的想法是关于未决到期的通知消息警告 以及重置会话计时器的选项。
另一种想法是将按键或鼠标移动传递给服务器,以便自动刷新会话计时器。
答案 0 :(得分:1)
解决方案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';
}
}
在表单页面上,只需在body标签上输入onload脚本:
<body onload="sessionTimeout(<%=session.Timeout %>)">
因此,如果您的超时设置为10分钟,用户将在第9分钟收到提醒。当然,您可能希望在用户单击“确定”按钮时更改代码。我上面的代码将刷新页面,绝对不是你想要做的,否则,用户的数据将会丢失。您可以使用上面的解决方案1中的通用处理程序重置会话并再次调用sessionTimeout
以重置客户端超时倒计时。
答案 1 :(得分:0)
在单页应用程序时代,如果您需要使用旧式学校方法,我的建议是创建Ajax请求,不断更新您网站中的数据或只检查会话过期(可能请求本身会阻止这种情况)。但如果它发生并且您收到会话过期消息,您可以显示一些登录弹出窗口供用户登录而不会离开实际页面。