ASP.Net中的客户端会话超时重定向

3
我想建立一种自动重定向用户到Timeout.aspx页面的方式,当他们因为不活动而导致会话过期时。我的应用程序使用表单身份验证,并且在同一个aspx页面内依赖于更新面板进行用户交互,因此我不希望在页面级别计时器到期后简单地重定向。出于同样的原因,我不能使用'<meta http-equiv="refresh"/>'。
我想做的是创建一个简单的Ajax Web服务,其中有一个名为IsSessionTimedOut()的方法,它只返回一个布尔值。我将使用JavaScript计时器定期调用该方法,如果它返回true,则重定向到Timeout.aspx。但是,我不希望调用此方法会重置会话超时计时器,否则会话永远不会因为服务调用而超时。有没有干净的方法可以避免这个进退两难的情况?希望有一个容易的解决方案,至今仍然让我困扰。

这种情况并没有一种干净或正确的方式。称其为“架构遗留问题”吧... - StingyJack
@所有人 - 处理这个问题还有一个干净且正确的方法。您只需要换个角度看待它。 - Sky Sanders
5个回答

9
问题的症结在于,在AJAX应用程序中,为了提供强大的用户体验,必须用大量的代码检查每个调用的状态,并确定故障是否由于过期的会话/票证引起。采取积极的方法,您的客户端脚本可以简化得多,同时提供更好的用户体验。 我专门针对这个问题构建了一个解决方案。 它允许交互式会话和表单票证寿命审核,而不会使会话或票证失效。 多个浏览器/选项卡没有问题。 忘记防晒霜;记住:进行Ajax操作时,要积极主动-您应该放弃会话,会话不应该放弃您;-) AsynchronousSessionAuditor 1.0: (点击此处)

这看起来非常有前途。我从未考虑过将HttpModule引入其中。谢谢! - Greg Ferreri
@Mercury - 非常欢迎你。我很高兴它能够有所帮助。 - Sky Sanders
@SkySanders,您的项目能够在配置为StateServer的asp.net会话状态中工作,并支持回调和后台请求的情况吗?如果可以的话,我希望讨论一下。最好的问候。 - Myra

2
这是目前我想到的最好解决方案,但我也愿意接受更好的建议。基本上,我有一个15分钟的javascript计时器,每次异步回发后都会重置。这种方法的缺点是,如果用户在另一个浏览器窗口中积极使用应用程序,则在后台打开第二个标签页或窗口将导致会话结束。
我的主页面上有类似的东西。javascript的最后一行添加了我的重置函数,以便在任何更新面板刷新时触发:
        <asp:ScriptManager ID="ScriptManager1" runat="server" ScriptMode="Release" OnAsyncPostBackError="ScriptManager1_AsyncPostBackError">
        <Scripts >
            <asp:ScriptReference Path="~/scripts/jquery/jquery-1.3.2.min.js" />
        </Scripts>
        </asp:ScriptManager>

        <script type="text/javascript">

        var redirectTimer = setTimeout('redirectToLogout()', 900000);

        function redirectToLogout() {
            window.location = "/logout.aspx";
        }

        function ResetTimeoutTimer() {
            clearTimeout(redirectTimer);
            redirectTimer = setTimeout('redirectToLogout()', 900000);
        }


        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(ResetTimeoutTimer);

       </script>

0

当服务器端会话过期时,超时是否真的很关键呢?

如果你只是想强制用户刷新会话或超时,我建议使用 window.setTimeout() 在一段时间后重定向到 Timeout.aspx。Timeout.aspx 的 codebehind 可以调用 Session.Abort() 来终止会话,这将迫使用户重新登录以继续。

我认为这种方法实际上比会话超时更准确可靠,因为(根据我的经验),会话超时往往取决于服务器负载和其他因素。


好的解决方案,但我认为如果用户有多个选项卡或窗口打开,它会出现问题。后台选项卡可能会导致意外注销发生。 - Greg Ferreri

0

这是一个好的想法...不幸的是,它似乎只在 .Net 4.0 中可用,而我正在针对 3.5。 - Greg Ferreri
我的目标是 .NET 4.6。你有尝试过吗?它真的有效吗? - Zev Spitz

0

我认为你的方法不太对... 如果你绝对不能使用简单的meta-refresh(这是处理这个问题最简单的方法),那么只需处理AJAX方法返回值表明会话已超时的情况即可。为什么需要额外的机制来做这件事呢?我对UpdatePanel不是很熟悉...但如果在会话过期时更新失败,肯定可以发送一些“嘿伙计,你需要重新登录”的消息吧?


仅仅处理ajax返回值是不够的,因为我需要浏览器在一段时间内没有任何操作时自动重定向到Timeout.aspx页面,例如当用户站起来离开电脑。在这种情况下,就不会有任何ajax调用到服务器。 - Greg Ferreri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接