许多网站(例如银行网站) - 在会话即将到期之前实施注销+ 1分钟警告。(20分钟)
(这个主题没有多少讨论 - 我见过的唯一问题是使用asp.net会员资格 - 我不使用)
每个用户都有一个session["lastActionTime"]
此会话将在以下时间更新为当前时间:
现在 - 当页面加载时,我设置了会话值。 (比如19:00)
此外,对于每个ajax请求(我的网站不创建回发 - 只有ajax jquery) - 我使用带有IRequiresSessionState
的ASHX处理程序将会话更新为当前时间。
我使用这样的东西:
jQuery(document).ajaxStart(function(){
gotoHandlerAndUpdateSessionTime();
})
现在 - 警告信息前1分钟的部分(“您的会话即将到期”):
每个ajax返回事件或page load
事件 - 我在{em> javascript :setInterval
中激活[sessionTime-1]
分钟(20-1 = 19)。 (当然 - 取消所有上一个setIntervals ...)
现在发生事件(setInterval)时 - 在到期时间前1分钟:( 19分钟)
我显示一个警告div,用户可以选择 exit 或 stay 。
问题:
1)如果用户没有在警告div上按任何内容,如何(显示div 后1分钟),我会将他记录下来怎么办?我应该在显示div时打开1分钟的setTimeout然后(如果没有按下)将其记录下来吗?
2)这是正确的做法吗?
3)这个奇怪的故事不应该有饼干吗? : - )
(请 - 没有会员资格 - 或表格认证)。 我也将这个问题标记为PHP,因为我知道它也与php程序员有关,我想听听他们的知识。
答案 0 :(得分:5)
关于你的第三个问题,只要你跟踪会话,你就不应该真正需要cookie。当javascript计时器倒计时时,只需在PHP中执行session_destroy()或在C#中执行Session.Abandon()。
以下是我在其中一个网站上使用的一些代码(可能不是最干净的,但你明白了):
var timeoutPolled = 0;
var timeoutSeconds = 10;
var countDownCounter = 61;
var timeoutBetweenPolls = 5000;
var stopCountDown = false;
function InitializePollTimer(timeoutMinutes) {
timeoutSeconds = timeoutMinutes * 60;
StartPollTimer();
}
function StartPollTimer() {
setTimeout(PollForTimeout, timeoutBetweenPolls);
}
function PollForTimeout() {
timeoutPolled++;
if ((timeoutPolled * timeoutBetweenPolls) > 1 * (timeoutSeconds * 1000)) {
$("#timeoutDialog").dialog({
autoOpen: false,
bgiframe: true,
resizable: false,
height: 250,
draggable: false,
modal: true,
zindex: 99999999,
position: 'top',
open: function(event, ui) { $(".ui-dialog-titlebar-close").hide(); },
buttons: {
"Continue using Website?": function() {
StopCountDown();
$.ajax({
type: "GET",
url: "RefreshSession.aspx",
cache: false
});
$(this).dialog("close");
timeoutPolled = 0;
StartPollTimer();
},
"Logout": function() {
Logout();
}
}
});
$("#timeoutDialog").dialog("open");
countDownCounter = 61;
CountDown();
}
else {
StartPollTimer();
}
}
function CountDown() {
if (stopCountDown) {
stopCountDown = false;
}
else {
countDownCounter--;
$("#countdownTimer").html(countDownCounter);
if (countDownCounter > 0) {
setTimeout(CountDown, 950);
}
else {
Logout();
}
}
}
function StopCountDown() {
stopCountDown = true;
}
function Logout() {
window.location.href = 'Logout.aspx';
}
答案 1 :(得分:1)
我可能不会告诉你任何你不知道的事情,但无论如何这里是我的两分钱 -
在没有按下警告按钮的用户上有两个区域:(1)当前显示在屏幕上的信息(2)阻止更多信息的其他请求 - 对于第一个,javascript计时器应该转发到LoggedOut页面如果没有被点击警告对话框的结果取消,对于第二个,肯定的服务器端逻辑应该检查当前请求是否在登录用户的上下文中。
对于cookies,如果您没有更改会话状态的默认设置,听起来就像您已经使用过的那样 - 我认为它被称为.ASPNET但是我可能错了,您可以使用代理工具进行检查。 / p>