Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止会话过期时表单数据丢失? 问题:_Javascript_Asp.net_Vb.net_Session_Timeout - Fatal编程技术网

Javascript 如何防止会话过期时表单数据丢失? 问题:

Javascript 如何防止会话过期时表单数据丢失? 问题:,javascript,asp.net,vb.net,session,timeout,Javascript,Asp.net,Vb.net,Session,Timeout,使用ASP.NET VB和/或JavaScript如何防止用户在会话过期时丢失表单数据 问题 当前,当用户填写表单数据的时间超过会话超时时间时,由于会话到期,post中的所有表单数据都会丢失 客户端操作,如键入不会重置会话超时时间 想法 我想知道如何防止这个问题发生 我最初的想法是发送一条通知消息,警告即将到期 以及重置会话计时器的选项 另一种方法是将按键或鼠标移动传递给服务器,以自动刷新会话计时器 在单页应用的时代,如果你需要使用老式的方法,我的建议是创建Ajax请求,不断更新网站中

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


问题

当前,当用户填写表单数据的时间超过会话超时时间时,由于会话到期,post中的所有表单数据都会丢失

客户端操作,如键入不会重置会话超时时间


想法

我想知道如何防止这个问题发生

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

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


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

解决方案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
确保您的泛型处理程序类实现了如上所述的
IRequiresessionState

然后在表单页面中,使用
jQuery.post
以您选择的时间间隔发布上述处理程序的请求。例如:

<script type="text/javascript">
    $(function () {
        setInterval(function () { $.post('<%= ResolveClientUrl("~/KeepSessionAlive.ashx")%>'); }, 10000); ' 10 secs interval
        });
</script>
在表单页面上,只需在body标签上输入onload脚本:

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


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

问题是页面上的数据需要安全,因此也需要使用会话超时来达到其预期目的。好的,其他方法与您最初的想法类似:while加载页面创建一个javascript变量,该变量具有用户在会话过期之前的时间限制。然后每隔几秒钟在超时时运行一些js函数,查看自上次刷新以来经过的时间是否已达到会话过期超时。如果检测到这种情况,则可以像a)禁用post按钮b)使用登录选项显示一些弹出窗口c)使用登录屏幕打开弹出页面等。登录弹出窗口是一个好主意。您可以在表单的onsubmit事件中使用ajax调用来查看用户是否仍在登录。如果没有,请取消提交并显示登录弹出窗口。登录后,他们可以提交表格。
<body onload="sessionTimeout(<%=session.Timeout %>)">