会话到期时如何防止表单数据丢失?

时间:2014-02-21 10:43:01

标签: javascript asp.net vb.net session timeout

问题

使用 ASP.NET VB 和/或 JavaScript 如何防止用户在会话过期时丢失表单数据?


问题

目前,当用户填写表格数据的时间超过会话超时期限时,由于会话到期,所有表格数据都会在帖子中丢失。

客户端操作,例如输入不要重置会话超时期限。


我想知道防止此问题发生的方法。

  • 我最初的想法是关于未决到期的通知消息警告 以及重置会话计时器的选项。

  • 另一种想法是将按键鼠标移动传递给服务器,以便自动刷新会话计时器。

2 个答案:

答案 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请求,不断更新您网站中的数据或只检查会话过期(可能请求本身会阻止这种情况)。但如果它发生并且您收到会话过期消息,您可以显示一些登录弹出窗口供用户登录而不会离开实际页面。