3

我目前正在开发一个 ASP.Net 3.5 项目并尝试实现会话超时检测。我知道如何使用启用的会话 cookie 来做到这一点,但没有我完全迷失了。

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

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

我的基于 cookie 的解决方案看起来像这样,我不想重现它的行为:

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

5 回答 5

2

应始终触发 global.asax 中的 Session_End,尽管使用的会话类型。

-edit:你可能也有兴趣

Session.IsNewSession

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

于 2009-09-09T14:11:17.747 回答
2

It looks like i've found a solution. I'm not very happy with it, but for the moment it works.

I've added a hidden field to my page markup

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

and following code to my CodeBehind

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

You also need to add this to your Web.config or ASP ignores all posted form fields

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

regenerateExpiredSessionId is the important attribute.

于 2009-09-09T15:20:11.923 回答
0

它的工作方式几乎相同 - 每次 ASP.NET 在 URL 中收到具有该会话 ID 的请求时,会话服务都会更新时间戳。当当前时间大于时间戳时,会话过期。

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

于 2009-09-09T14:13:20.337 回答
0

我会在这里查看 AnthonyWJones 对类似问题的回答的“数据库”部分:

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

In your session start event, you should be able to check a database for the existence of the SessionID - I assume that if I request a page with the SessionID in the URL, then that is the SessionID that I'll use - I've not tested that.

You should make sure you clear this DB down when a user logs out manually to ensure that you store a new instance of your flag.

于 2009-09-09T14:47:20.753 回答
-1

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

这是Nikhil 博客中提出的解决方案之一。核实。

于 2009-09-09T14:20:34.107 回答