检测SessionState
是否死亡以将用户发送到“会话已过期”页面的最佳方法是什么?我已经成功配置了应用程序(在Web.config
中)以在身份验证cookie消失(有相应设置)时执行此操作,但是到目前为止,我还没有找到一种有效的方法来在SessionState
上执行类似操作离开了。有问题的应用程序在Session
中保存了一些数据,如果其中任何一个都消失了,则应向用户显示“会话已过期-请重新登录”页面。
到目前为止,我可以想到的唯一选择是在我访问的每个地方Session
,但这显然不是最佳解决方案。
为什么不在母版页上包含会话检查?如果会话已过期,则任何会话变量都将返回null。因此,在page_load
上您可以检查其中的任何一个并执行相应的操作,即Response.Redirect
。但是,您说在Web.Config
中可以检查身份验证cookie何时消失,因此您不能对此执行操作吗?
另一种方法是使用HTTP Module,它将拦截每个请求并决定如何处理。这将比我的第一种方法更好,它将在任何页面处理之前发生。
我记得一个类似的问题。实际上,您机会不多。
[我的意思是,您无法在服务器触发SessionEnd事件时将用户重定向到页面,您可以在Global.asax中处理该事件。
但是,如果您从页面内部使用Session对象,您可以做一些有用的事情。例如,将Session ID保存在页面的上下文中或隐藏字段中。回发时,将保存的ID与会话ID进行比较。如果它们不同,则开始新的会话,这意味着旧会话已过期。
现在是时候重定向用户了:)
希望对您有所帮助。
是的,很难。 :)
没有真正的简单/确定的方法来做。
[一种选择是在Session_Start
(global.asax)期间,将Session /]贴在Session []集合中,然后在基础页(例如母版)的Page_Load中检查该值。
另一种选择是检查实际的ASPX cookie:
HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"];
如果为空,则会话结束。
当客户端登录时,您给他一个会话标记,就像未过期一样,将其设置为1。
然后您编写一个Web模块,该模块在每个http请求上检查notexired = 1。如果该检查抛出异常或为0,则可以拒绝访问或重定向到错误页面。
或者如果您将会话保存到数据库中,则可以从数据库中更新会话。
通常,它也可以与AJAX处理程序一起使用,与基础页类黑客不同。
另一种方法是检查存储库会话值是否得到维护。在我的情况下,我们有一个哈希表,并记录会话ID,然后每次需要该会话时,我们都会检查该值是否仍然存在。一种集中式的方式来使您的应用保持会话状态希望这会有所帮助/
在所需页面的Page_Load事件中签出此属性:
Dim sessionExpired as Boolean = Context.Session.IsNewSession
有关更多信息,请访问this link。
注意,会话状态的“实时性”默认设置为20分钟,但这可以通过timeout属性在应用程序的web.config中轻松更改:
<system.web>
<!--Set default timeout for session variables (default is 20 minutes, but was changed to 30 minutes-->
<sessionState mode="InProc" cookieless="false" timeout="30" />
</system.web>
此外,请在MSDN上查看其他属性mode和cookieles。它可以帮助扩展您当前业务状况的有效性。