代码之家  ›  专栏  ›  技术社区  ›  Cubicle

使用无cookie会话时如何检测会话超时

  •  3
  • Cubicle  · 技术社区  · 15 年前

    我目前正在开发一个ASP.NET 3.5项目,并尝试实现会话超时检测。我知道如何使用已启用的会话cookie来完成它,但是如果没有,我就完全失去了。

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

    有人能告诉我怎么做吗?

    我的基于cookie的解决方案看起来是这样的,我不想复制它的行为:

    if (Session.IsNewSession && (Request.Cookies["ASP.NET_SessionId"] != null))
        Response.Redirect("...");
    
    5 回复  |  直到 15 年前
        1
  •  2
  •   Jan Jongboom    15 年前

    在global.asax中结束的会话应始终被激发,尽管使用的会话类型不同。

    -编辑:你也可能对

    Session.IsNewSession
    

    因为这提供了有关新请求的信息,说明上一个会话是否可能已超时。

        2
  •  2
  •   Cubicle    15 年前

    看来我找到了解决办法。我对它不太满意,但目前它起作用了。

    我在页面标记中添加了隐藏字段

    <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;   
        }
    }
    

    您还需要将其添加到web.config中,否则asp将忽略所有已发布的表单字段。

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

    重新生成expiredsessionid是重要的属性。

        3
  •  0
  •   Rex M    15 年前

    它的工作原理基本相同——每次ASP.NET在URL中收到具有该会话ID的请求时,会话服务都会更新时间戳。当当前时间超过时间戳时,会话将过期。

    如果您在会话中放置了一些内容,并检查它是否在每个请求中都存在,如果不存在,您就知道会话是新的(替换过期的会话或新用户)。

        4
  •  0
  •   Community CDub    7 年前

    我想看一下AnthonyWjones回答类似问题的“数据库”部分:

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

    在会话开始事件中,您应该能够检查数据库中是否存在sessionid-我假设如果我请求一个URL中包含sessionid的页面,那么这就是我将使用的sessionid-我还没有测试过这一点。

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

        5
  •  -1
  •   castle1971    15 年前

    如果你不喜欢 Session_End ,你可以尝试一个非常快速和肮脏的解决方案。建立一个 Session["Foo"] 价值在 Session_Start 在里面 global.asax ,然后检查 会话[ FoO ] 在你的页面上。如果为空,则会话将过期。

    这是 Nikhil's Blog . 检查一下。