【问题标题】:How to prevent the loss of form data when session expires?session过期时如何防止表单数据丢失?
【发布时间】:2014-03-22 19:58:01
【问题描述】:

问题

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


问题

目前,当用户填写表单数据的时间超过会话超时期限时,所有表单数据都会因会话到期而在发布时丢失。

客户端操作,例如键入 DO NOT 会重置会话超时期限。


想法

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

  • 我最初的想法是一个通知消息警告即将到期 以及重置会话计时器的选项。

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

【问题讨论】:

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


    【解决方案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';
        }
    }
    

    在您的表单页面上,只需在您的正文标签上输入 onload 脚本:

    <body onload="sessionTimeout(<%=session.Timeout %>)">
    

    因此,如果您的超时设置为 10 分钟,用户将在第 9 分钟收到提醒。当然,您可能希望在用户单击“确定”按钮时更改代码。我上面的代码将刷新页面,这绝对不是您想要做的,否则,用户的数据将会丢失。您可以使用上述解决方案 1 中的通用处理程序来重置会话并再次调用 sessionTimeout 以重置客户端超时倒计时。

    【讨论】:

      【解决方案2】:

      在单页应用程序时代,如果您需要使用老式方法,我的建议是创建 Ajax 请求,以不断更新您网站中的数据,或者只检查会话到期(可能请求本身会阻止这种情况)。但是,如果发生这种情况并且您收到会话过期消息,您可以只显示一些登录弹出窗口供用户登录,而无需离开实际页面。

      【讨论】:

      • 问题是页面上的数据需要安全,因此还需要使用会话超时来达到预期目的。
      • 好的,所以其他方法类似于您最初的想法:在加载页面时创建一个 javascript 变量,该变量具有用户在会话过期之前的时间限制。然后每隔几秒在超时时运行一些 js 函数,以查看自上次刷新以来经过的时间是否达到会话过期超时。如果检测到这种情况,那么您可以像 a) 禁用发布按钮 b) 显示一些带有登录选项的弹出窗口 c) 打开带有您的登录屏幕等的弹出页面。
      • 登录弹出窗口是个好主意。您可以在表单的 onsubmit 事件中使用 ajax 调用来查看用户是否仍然登录。如果没有,取消提交并显示登录弹出窗口。登录后,他们可以提交表单。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多