检测会话到期

时间:2016-03-14 10:49:54

标签: .net

在我的.net应用程序中,我需要存储会话到期前显示的页面,例如,如果用户在页面A中,并且会话在hi访问应用程序时到期我必须将他重定向到页面甲

我的想法是检测会话过期,如果事件发生,请将数据保存在数据库中。

6 个答案:

答案 0 :(得分:0)

您只需使用会话变量即可。 在页面加载时检查变量是否存在,如果它不再存在,您可以保存所需的数据。

如果会话已过期,您也可以检索URL。 UserId应存储在某些" permanent"放置,就像页面中的隐藏字段一样,因此如果会话已过期,您也可以检索它。

答案 1 :(得分:0)

要回答您的问题:您可以使用Session_End中的global.asax方法来检测即将到期的会话。

不幸的是,当时,用户访问的页面的信息不再(方便)可用,所以我怀疑这会帮助您解决潜在的问题。

作为替代方案,我建议您在每次打开页面时更新数据库中用户的“上次访问过的页面”。您可以在母版页中全局执行此操作(如果有的话)。

答案 2 :(得分:0)

您可以执行以下操作:

1)对于会话上下文数据(用户,URL等)中的每个请求(Application_BeginRequest)存储:

Session["LastPageData"] = new { Url = ..., };

2)在会话即将结束之前,您可以使用该信息存储在数据库中,例如:

void Session_End(Object sender, EventArgs E) {
    // do persistence logic here based on Session["LastPageData"]
}

如果Session_End中没有某些信息,您可以保留每个请求的信息,但这将意味着额外的开销(每个请求INSERT / UPDATE

答案 3 :(得分:0)

由于您已经知道是一个Web应用程序,您的用户代理和服务器之间的交互已断开,即Web服务器或浏览器没有关于用户当前状态的信息,因此没有任何事件可以让您知道该会话已过期,但您可以根据会话超时值计算它,并检查会话是否已过期(或做任何类似的事情)。

因此,只有在请求到达您的服务器并处理请求时,您才能知道会话已过期。

为了解决您的问题,在会话到期时您将用户重定向到登录页面,在重定向之前您可以将当前页面URL相对路径作为参数放入URL中,并且在成功登录后,您可以将用户重定向到上一个从查询字符串中读取页面。

您的登录网址将如下所示https://myapp.com/Account/Login?returnUrl=%2F MyAccount

此处MyAccount是会话过期的最后访问过的网址。

asp.net MVC授权使用相同的方法,您可以使用默认模板查看它。

答案 4 :(得分:0)

你甚至可以在你的global.asax文件中使用Session_OnEnd,Session_End(),

在这种情况下,您可以显式地将会话值保存到数据库中,因为如果会话超出了proc(在状态服务器或sql server中保存会话),则不会调用Session_OnEnd和Session_End。

现在,当用户再次打开应用程序,然后在每个页面加载时,你必须检查会话变量的值(我不确定它是否可以自己完成Session_Start或global.asax中的Apllication_Start事件),如果它为null然后从db获取最新值并重定向到相应的页面。

答案 5 :(得分:0)

我用javascript解决问题,方法是使用表示会话超时的变量,并使用declenche会话保存的全局javascript方法在到期之前保存。 $(document).ready(function () { var saveSessionTimer; clearTimeout(saveSessionTimer); //timerToSaveSession = sessionExpireTime - 10 seconds saveSessionTimer = setTimeout(saveSession, timerToSaveSession); });
其中saveSession是调用控制器并进行保存的方法。