【问题标题】:Session not ending in ASP.NET会话未在 ASP.NET 中结束
【发布时间】:2009-07-21 09:09:08
【问题描述】:

我创建了一个使用 global.asax 的 asp.net 应用程序。我创建了一个静态类,它使用属性存储用户信息,例如 LoginID、CompanyID 等。属性 IsLoggedIn 指示用户是否登录。我在同一个类中创建了一个方法 ResetAll() 来重置这些属性。

问题在于,如果用户直接关闭浏览器窗口而不注销,则不会重置属性值。因此,如果用户打开一个新的浏览器窗口,用户会自动登录。我还在 Session_End() 中调用了 ResetAll() ,但它仍然无法正常工作。如果用户直接关闭浏览器窗口,有人可以解释一下这有什么问题,或者只是如何重置属性值。

【问题讨论】:

    标签: session


    【解决方案1】:

    如果我没看错,并且你有一个包含静态成员的类,那么你就会遇到问题。对于 ASP.NET Web 应用,静态成员对于整个 AppDomain 是静态的,而不仅仅是对于单个用户,因此无论请求来自何处,其值都是相同的。

    听起来您真正需要考虑的是将用户信息类的实例存储在会话中。这样,信息就特定于该特定用户。此外,这应该可以解决您的问题,因为会话 cookie 通常会在浏览器窗口关闭时被删除,从而在重新打开浏览器窗口时强制执行新会话。

    比如:

    Dim thisUser As New UserInformation()
    thisUser.LoginID = someValue
    Session("UserInformation") = thisUser
    

    【讨论】:

    • 你的意思是说,我必须使用普通类并在会话中存储,而不是创建静态类。
    • 没错。创建类的非静态实例并将其存储在会话中。
    【解决方案2】:

    您不能将类设为静态。比让用户跨会话登录更糟糕的是,您的系统中不能有多个用户。他们都将共享相同的登录信息。您应该阅读有关静态的内容。

    您想要的是在会话中存储该类的一个实例,并在需要时访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多