2009-09-09 94 views
3

我目前正在研究ASP.Net 3.5项目并试图实现会话超时检测。我知道如何使用启用会话cookie来做到这一点,但没有我完全失去了。如何使用无Cookie会话检测会话超时

当会话超时发生时,我想将用户重定向到某个自定义页面。

有人可以解释我该怎么做吗?

我的基于cookie的解决方案是这样的,我wan't重现其行为:

if (Session.IsNewSession && (Request.Cookies["ASP.NET_SessionId"] != null)) 
    Response.Redirect("..."); 

回答

2

它看起来像我找到了解决方案。我对此并不满意,但目前它的工作。

我添加了一个隐藏字段到我的网页标记

<asp:HiddenField ID="sessionID" runat="server" /> 

和下面的代码我隐藏

public void Page_Load(object sender, EventArgs eventArgs) 
{ 
    if (Context.Session != null) { 
     if (Context.Session.IsNewSession) { 
      if (!string.IsNullOrEmpty(sessionID.Value)) { 
       Response.Redirect("~/Timeout.aspx") 
      } 
     } 
     sessionID.Value = Context.Session.SessionID; 
    } 
} 

您还需要添加到您的网站。config或ASP忽略所有发布的表单字段

<sessionState cookieless="true" regenerateExpiredSessionId="false"/> 

regenerateExpiredSessionId是重要的属性。

2

Session_End中在Global.asax应始终被解雇,尽管使用会话类型。

-edit:您可能也有兴趣在

Session.IsNewSession 

,因为这让你在新的请求是否前一交易日可能已经超时的信息。

+0

我知道,但Session_End不允许将重定向推送到客户端。但是,谢谢。我会将这个要求添加到我的问题中。 – Cubicle 2009-09-09 14:13:07

+2

仅当您使用InProc会话时才会触发Session_End - 仅仅因为它们不含Cookie,并不排除使用Sql或State Server模式。 – 2009-09-09 14:20:50

+0

我试过Session.IsNewSession,但是这种方式我很难区分全新的会话和超时的会话。 – Cubicle 2009-09-09 14:29:05

0

它的工作方式非常相似 - 会话服务每次在URL中接收到具有该会话标识的请求时都会更新一个时间戳。当当前时间超过时间戳时,会话过期。

如果您在会话中添加了某些内容,并检查每个请求中是否存在该内容,如果不存在,则知道该会话是新鲜的(替换已过期的用户或新用户)。

+0

我试图使用IsNewSession。它应该与您建议的解决方案相同。我的问题是我无法通过这种方式区分新会话和超时会话。 – Cubicle 2009-09-09 14:19:59

-1

如果你不喜欢Session_End,你可以尝试一个非常快速和肮脏的解决方案。在global.asax中设置一个Session["Foo"]Session_Start,然后在您的页面中检查Session["Foo"]。如果为空,则会话已过期。

这是在Nikhil's Blog中提出的解决方案之一。核实。

+0

当您检查会话中是否存在Foo时,会话将已重新初始化,因此无法工作。 – 2009-09-09 14:35:51

0

我看看AnthonyWJones'答案“数据库”部分,以一个类似的问题在这里:

ASP.Net Session Timeout detection: Is Session.IsNewSession and SessionCookie detection the best way to do this?

在会话开始时,你应该能够检查数据库中是否存在SessionID - 我假设如果我在URL中请求带有SessionID的页面,那么这就是我将使用的SessionID - 我没有测试过。

您应该确保在用户手动注销时清除此数据库,以确保您存储标志的新实例。