检测SessionState
是否已经死亡以便将用户发送到“会话已过期”页面的最佳方法是什么?我已成功配置应用程序(在Web.config
中),以便在身份验证cookie消失时执行此操作(有一个设置),但到目前为止,我还没有找到一种有效的方法来执行类似的操作{ {1}}消失了。有问题的应用程序在SessionState
中包含一些数据,并且如果其中任何一个消失,则应向用户显示“会话已过期 - 请再次登录”页面。
到目前为止,我可以考虑在我访问Session
的每个地方进行此操作的唯一选择,但这显然不是最佳解决方案。
答案 0 :(得分:4)
我记得一个类似的问题。实际上,你没有太多机会。
我的意思是,当服务器触发SessionEnd事件时,无法将用户重定向到页面,您可以在Global.asax中处理。
但是,如果您从页面内部使用Session对象,则可以执行一些有用的操作...例如,将会话ID保存在页面的上下文中或隐藏字段中。回发时,将保存的ID与会话ID进行比较。如果它们不同,则会启动一个新会话,这意味着旧会话已过期。
现在是时候重定向用户了:)
希望得到帮助。
答案 1 :(得分:3)
是的,这很难。 :)
没有真正简单/明确的方法。
一个选项是在Session_Start
(global.asax)期间在Session []集合中粘贴guid / idenfitier,然后在基页的Page_Load中检查此值(例如master)。
另一种选择是检查实际的ASPX cookie:
HttpCookie sessionCookie = Request.Cookies["ASP.NET_SessionId"];
如果它为空,则会话结束。
答案 2 :(得分:1)
为什么不在主页上包含会话检查?如果会话已过期,则任何会话变量都将返回null。因此,在page_load
上,您可以查看其中的任何内容并执行相应的操作,即Response.Redirect
。但是你在Web.Config
中说你可以检查身份验证cookie什么时候消失了,那么你能否对此进行操作呢?
另一种方法是使用HTTP Module来拦截每个请求并决定如何处理它。这将比我的第一个方法更好,它将在任何页面处理之前发生。
答案 3 :(得分:1)
当客户端登录时,您会给他一个会话标记,例如notexpired并将其设置为1.
然后你编写一个web模块,在每个http请求中检查notexired是否为1。 如果该检查抛出异常或为0,则可以拒绝访问或重定向到错误页面。
如果您将会话保存到数据库中,您可以从数据库续订会话。
在内部,这也适用于AJAX处理程序,与基页类hacks不同。
答案 4 :(得分:1)
答案 5 :(得分:0)
另一种方法是检查存储库会话值是否得到维护。 在我的情况下,我们有一个哈希表,我们记录会话ID,然后每当我们需要该会话时,我们检查该值是否仍然存在。 这是一种集中的方式来保持您的应用程序的会话状态 希望这会有所帮助/
答案 6 :(得分:0)
在所需页面的Page_Load事件中签出此属性:
def get_reg_loss(reg_layers):
def reg_loss_term(y_true, y_pred):
return tf.add_n([r.losses[0] for r in reg_layers])
return reg_loss_term
model.compile(..., metrics=[..., get_reg_loss(reg_layers)])
有关更多信息,请访问this link。
请注意,会话状态的“实时性”默认设置为20分钟,但这可以通过 timeout 属性在应用程序的web.config中轻松更改:
Dim sessionExpired as Boolean = Context.Session.IsNewSession
此外,请在MSDN上查看其他属性 mode 和 cookieles 。它可以帮助扩展您当前业务状况的有效性。