【发布时间】:2010-12-01 00:31:24
【问题描述】:
我正在尝试确定给定的 ASP.NET 会话在超时之前还剩多少时间。
如果没有现成的 time-to-timeout 值,我也可以从它的最后一次访问时间计算它(但我也没有找到这个)。知道怎么做吗?
【问题讨论】:
标签: asp.net session session-state session-timeout
我正在尝试确定给定的 ASP.NET 会话在超时之前还剩多少时间。
如果没有现成的 time-to-timeout 值,我也可以从它的最后一次访问时间计算它(但我也没有找到这个)。知道怎么做吗?
【问题讨论】:
标签: asp.net session session-state session-timeout
如果您在服务器上处理请求,那么超时刚刚被重置,所以剩下的整整 20 分钟(或任何您配置的时间)。
如果您需要客户端警告,则需要创建一些 JavaScript 代码,该代码将在“现在”大约 20 分钟后触发。请参阅 setTimeout 方法。
我用它在请求页面 15 分钟后显示警告。它会弹出一条警报,例如“您的会话将在 {HH:mm} 到期,请保存您的工作”。使用了确切的时间而不是“5 分钟内”,因为您永远不知道用户何时会看到该消息(他是否在警报触发 10 分钟后返回到他的计算机?)。
【讨论】:
对于多页解决方案,可以将最后一次请求时间保存在 cookie 中,而 javascript 可以考虑这个最后一次访问时间来处理警告消息或注销操作。
【讨论】:
我刚刚实施了一个像这里问的那样的解决方案,它似乎有效。我有一个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 代码看到会话已在此处重置,即使页面从未刷新或重定向。
【讨论】:
您可以从以下位置获取超时时间:
Session.Timeout
这还不足以提供信息吗,因为每次请求都会重置超时?不知道您想如何在不发出请求的情况下显示此内容?
无论如何,最好的方法是在每个请求上设置一些具有最后访问时间的 Session 变量。那应该提供远程信息。
【讨论】: