如何检测SessionState是否已过期?

时间:2010-11-09 11:23:48

标签: asp.net session

检测SessionState是否已经死亡以便将用户发送到“会话已过期”页面的最佳方法是什么?我已成功配置应用程序(在Web.config中),以便在身份验证cookie消失时执行此操作(有一个设置),但到目前为止,我还没有找到一种有效的方法来执行类似的操作{ {1}}消失了。有问题的应用程序在SessionState中包含一些数据,并且如果其中任何一个消失,则应向用户显示“会话已过期 - 请再次登录”页面。

到目前为止,我可以考虑在我访问Session的每个地方进行此操作的唯一选择,但这显然不是最佳解决方案。

7 个答案:

答案 0 :(得分:4)

我记得一个类似的问题。实际上,你没有太多机会。

我的意思是,当服务器触发SessionEnd事件时,无法将用户重定向到页面,您可以在Global.asax中处理。

但是,如果您从页面内部使用Session对象,则可以执行一些有用的操作...例如,将会话ID保存在页面的上下文中或隐藏字段中。回发时,将保存的ID与会话ID进行比较。如果它们不同,则会启动一个新会话,这意味着旧会话已过期。

现在是时候重定向用户了:)

希望得到帮助。

答案 1 :(得分:3)

是的,这很难。 :)

没有真正简单/明确的方法。

一个选项是在Session_Start(global.asax)期间在Session []集合中粘贴guid / idenfitier,然后在基页的Page_Load中检查此值(例如master)。

另一种选择是检查实际的ASPX cookie:

HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"];

如果它为空,则会话结束。

答案 2 :(得分:1)

为什么不在主页上包含会话检查?如果会话已过期,则任何会话变量都将返回null。因此,在page_load上,您可以查看其中的任何内容并执行相应的操作,即Response.Redirect。但是你在Web.Config中说你可以检查身份验证cookie什么时候消失了,那么你能否对此进行操作呢?

另一种方法是使用HTTP Module来拦截每个请求并决定如何处理它。这将比我的第一个方法更好,它将在任何页面处理之前发生。

答案 3 :(得分:1)

当客户端登录时,您会给他一个会话标记,例如notexpired并将其设置为1.

然后你编写一个web模块,在每个http请求中检查notexired是否为1。 如果该检查抛出异常或为0,则可以拒绝访问或重定向到错误页面。

如果您将会话保存到数据库中,您可以从数据库续订会话。

在内部,这也适用于AJAX处理程序,与基页类hacks不同。

答案 4 :(得分:1)

互联网上有很多例子可以解决你的问题(这很常见)

看看

http://geekswithblogs.net/shahed/archive/2007/09/05/115173.aspx

答案 5 :(得分:0)

另一种方法是检查存储库会话值是否得到维护。 在我的情况下,我们有一个哈希表,我们记录会话ID,然后每当我们需要该会话时,我们检查该值是否仍然存在。 这是一种集中的方式来保持您的应用程序的会话状态 希望这会有所帮助/

答案 6 :(得分:0)

在所需页面的Page_Load事件中签出此属性:

def get_reg_loss(reg_layers):
    def reg_loss_term(y_true, y_pred):
        return tf.add_n([r.losses[0] for r in reg_layers])

    return reg_loss_term

model.compile(..., metrics=[..., get_reg_loss(reg_layers)])

有关更多信息,请访问this link

请注意,会话状态的“实时性”默认设置为20分钟,但这可以通过 timeout 属性在应用程序的web.config中轻松更改:

Dim sessionExpired as Boolean = Context.Session.IsNewSession

此外,请在MSDN上查看其他属性 mode cookieles 。它可以帮助扩展您当前业务状况的有效性。