如何使用无Cookie会话检测会话超时
我目前正在研究ASP.Net 3.5项目并试图实现会话超时检测。我知道如何使用启用会话cookie来做到这一点,但没有我完全失去了。如何使用无Cookie会话检测会话超时
当会话超时发生时,我想将用户重定向到某个自定义页面。
有人可以解释我该怎么做吗?
我的基于cookie的解决方案是这样的,我wan't重现其行为:
if (Session.IsNewSession && (Request.Cookies["ASP.NET_SessionId"] != null))
Response.Redirect("...");
它看起来像我找到了解决方案。我对此并不满意,但目前它的工作。
我添加了一个隐藏字段到我的网页标记
<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是重要的属性。
Session_End中在Global.asax应始终被解雇,尽管使用会话类型。
-edit:您可能也有兴趣在
Session.IsNewSession
,因为这让你在新的请求是否前一交易日可能已经超时的信息。
它的工作方式非常相似 - 会话服务每次在URL中接收到具有该会话标识的请求时都会更新一个时间戳。当当前时间超过时间戳时,会话过期。
如果您在会话中添加了某些内容,并检查每个请求中是否存在该内容,如果不存在,则知道该会话是新鲜的(替换已过期的用户或新用户)。
我试图使用IsNewSession。它应该与您建议的解决方案相同。我的问题是我无法通过这种方式区分新会话和超时会话。 – Cubicle 2009-09-09 14:19:59
如果你不喜欢Session_End
,你可以尝试一个非常快速和肮脏的解决方案。在global.asax
中设置一个Session["Foo"]
值Session_Start
,然后在您的页面中检查Session["Foo"]
。如果为空,则会话已过期。
这是在Nikhil's Blog中提出的解决方案之一。核实。
当您检查会话中是否存在Foo时,会话将已重新初始化,因此无法工作。 – 2009-09-09 14:35:51
我看看AnthonyWJones'答案“数据库”部分,以一个类似的问题在这里:
在会话开始时,你应该能够检查数据库中是否存在SessionID - 我假设如果我在URL中请求带有SessionID的页面,那么这就是我将使用的SessionID - 我没有测试过。
您应该确保在用户手动注销时清除此数据库,以确保您存储标志的新实例。
我知道,但Session_End不允许将重定向推送到客户端。但是,谢谢。我会将这个要求添加到我的问题中。 – Cubicle 2009-09-09 14:13:07
仅当您使用InProc会话时才会触发Session_End - 仅仅因为它们不含Cookie,并不排除使用Sql或State Server模式。 – 2009-09-09 14:20:50
我试过Session.IsNewSession,但是这种方式我很难区分全新的会话和超时的会话。 – Cubicle 2009-09-09 14:29:05