【问题标题】:Correct way to deal with potential session expiration处理潜在会话到期的正确方法
【发布时间】:2012-08-12 09:19:23
【问题描述】:

我想知道当您经常在代码中使用存储在其中的值时,处理会话可能到期的最佳(例如最有效、普遍接受的行业标准)方法是什么。

例如,我经常使用(在 C# 中)类似于以下的行:

Guid personGuid = (Guid)Session[SSPersonGuid];

我正在检查 Page_Load 的值是否为 null 并进行相应处理,但会话可能会在用户在页面上时过期,在这种情况下,当他们单击页面上的按钮时,我们需要使用类似上面,会有一个 NullReferenceException。

处理这个问题的最好方法是在每次使用之前检查 null,如下所示:

if (Session[SSPersonGuid] == null) {...}

还是有什么我不知道的特殊情况?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    什么是最好的(例如最有效、普遍接受的行业 标准)处理会话可能到期的方法?

    最好是通过设置a Out-Of-Process session state serverout-of-process SQL Server 使它们不会过期。

    您也可以在The Session_OnEnd Event 中检测到它

    编辑:

    Jeff Atwood 所说的与 Scotts 的回答相对应:http://www.codinghorror.com/blog/2008/04/your-session-has-timed-out.html

    每天我都会收到各种各样的会话超时消息 来源,但我从未见过来自的会话到期消息 以 gmail 为例。这是我的建议:

    1. 在浏览器中创建一个后台 JavaScript 进程,发送 定期向服务器发送心跳。使用定时重新生成一个新的 cookie 例如,每 5 或 10 分钟到期一次。

    2. 如果您担心 会话劫持——你真的应该——使用受 HTTPS 保护的 联系。这对金融机构来说绝对是轻而易举的事 任何类型的。

    【讨论】:

    • 使用 StateServer 和 sql server 方法,会话仍然可以在页面上超时,但不是吗?
    • 查看我的编辑。关于在进程外存储会话时丢失会话,如果 StateServer 进程重新启动或服务器重新启动......个人从未见过或经历过进程外会话超时。
    • 我要么做错了事,要么真的不明白它应该如何工作。我尝试通过将超时设置为 2 分钟来测试它,以查看它是否仍然超时并且在两分钟后它确实超时了。根据我有限的理解,数据(例如 SSPersonGuid)应该仍然可用。或者我应该不设置超时并且它永远不会超时。或者我需要做些什么才能让它切换到 StateServer 模式(所需的服务正在运行,我的意思是我可能需要重新启动某些东西或其他任何东西来识别设置)。顺便谢谢。
    【解决方案2】:

    我看到很多是加载每个页面的 JavaScript,其中包含一个计时器,用于检查会话是否即将到期。如果是这样(比如说,在 2 分钟内),显示一个弹出窗口,告诉用户会话即将到期,并询问用户是否要继续。然后,该脚本可以向服务器发出 AJAX 回调以保持会话处于活动状态。

    但是,这不会阻止关闭 JavaScript 的用户出现问题。

    【讨论】:

    • IIS 回收 wpw3 进程时这是如何工作的?如果你不知道 IIS 什么时候要回收进程,你怎么知道会话会过期?我很想看看代码。
    • 在大多数(但不是所有)情况下,您可以禁用回收。 stackoverflow.com/questions/3156925/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多