获取ASP.NET会话上次访问时间(或超时)

时间:2009-09-24 08:26:08

标签: asp.net session session-state session-timeout

我正在尝试确定给定的ASP.NET会话剩余多长时间,直到超时为止。

如果没有现成的超时时间值,我也可以从上次访问时间计算出来(但我也没有找到)。知道怎么做吗?

4 个答案:

答案 0 :(得分:2)

如果你在服务器上,处理请求,那么超时刚刚被重置,所以整整20分钟(或你配置的任何东西)仍然存在。

如果您需要客户端警告,则需要创建一些javascript代码,该代码将从“now”开始大约20分钟。请参阅setTimeout方法。

我已经使用它在请求页面15分钟后显示警告。它弹出一个警告,例如“你的会话将在{HH:mm}到期,请保存你的工作”。确切的时间用于代替“在5分钟内”,因为您永远不知道用户何时会看到该消息(警报发出后10分钟他是否返回计算机?)。

答案 1 :(得分:1)

对于多页解决方案,可以在cookie中保存上次请求时间,javascript可以考虑最后一次访问时间来处理警告消息或登出操作。

答案 2 :(得分:0)

你可以在几分钟内获得超时:

Session.Timeout

这是否足以提供信息,因为每次请求都会重置超时?不知道如何在没有请求的情况下显示它?

无论如何,最好的方法是在每个请求上设置一些具有最后访问时间的Session变量。这应该提供远程信息。

答案 3 :(得分:0)

我刚刚实施了一个类似于此处询问的解决方案,它似乎有效。我有一个MVC应用程序,并且在我的_Layout.chtml页面中有这个代码,但它可以在asp.net应用程序中工作,方法是将它放在我认为的母版页中。我通过amplify.js插件使用本地会话存储。我使用本地会话存储,因为正如Grieves先生所说,可能存在用户以不会导致页面刷新或重定向但仍重置服务器上的会话超时的方式访问应用程序的情况。

$(document).ready(function () {

var sessionTimeout = '@(Session.Timeout)'; //from server at startup
amplify.store.sessionStorage("sessionTimeout", sessionTimeout);
amplify.store.sessionStorage("timeLeft", sessionTimeout);
setInterval(checkSession, 60000); // run checkSession this every 1 minute
    function checkSession() {
    var timeLeft = amplify.store.sessionStorage("timeLeft");
    timeLeft--; // decrement by 1 minute
    amplify.store.sessionStorage("timeLeft", timeLeft);
        if (timeLeft <= 10) {
        alert("You have  " + timeLeft + " minutes before session timeout. ");
                   }
     }
});

然后在一个页面中,用户永远不会导致页面刷新但仍然命中服务器从而导致其会话重置,我把它放在按钮点击事件上:

$('#MyButton').click(function (e) {

   //Some Code that causes session reset but not page refresh here
    amplify.store.sessionStorage("sessionTimeout", 60); //default session timeout
    amplify.store.sessionStorage("timeLeft", 60);


});

使用本地会话存储允许我的_Layout.chtml代码看到会话已在此处重置,即使页面从未刷新或重定向。