Я создал следующую скрипку для тестирования: https://jsfiddle.net/Twisty/toxjLmd8/10/
Я добавил несколько вещей для увеличения информации в консоли. Когда я осматриваю страницу и просматриваю хранилище, я вижу session
cookie и username
cookie. Если я обновлюсь, мне будет предложено ввести имя еще раз. Так что, похоже, работает как ожидалось.
$(function() {
function setCookie(cname, cvalue, exdays) {
var d = new Date();
if (exdays == undefined) {
exdays = 1;
}
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
console.log("Set Cookie: " + cname + "=" + cvalue, expires);
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
function getCookie(cname) {
var name = cname + "=";
var decodedCookie = decodeURIComponent(document.cookie);
var ca = decodedCookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return false;
}
function checkCookie() {
var user = getCookie("username");
if (user != "") {
$("#display").html("Welcome back " + user);
} else {
$("#display").html("Welcome, please enter your name.");
user = prompt("Please enter your name:", "");
if (user != "" && user != null) {
setCookie("username", user, 30);
}
}
}
function newSession() {
var sessionnumber = Math.random() * 10000000000.0;
console.log("New Session: " + sessionnumber);
setCookie("session", sessionnumber, 0.0125);
}
function checkSession() {
if (getCookie("session") == false) {
newSession();
}
console.log("Current Session: " + getCookie("session"));
}
window.onbeforeunload = function() {
console.log("Closing - Expire 'username' Cookie");
setCookie("username", "", 0);
};
window.onload = checkCookie();
window.onload = checkSession();
});
Устанавливая прошедшую дату или текущую дату и время, браузер должен сразу же прекратить использование куки и удалить его. Установка cookie без срока действия может привести к неожиданным результатам в разных браузерах. Если дата не установлена, она должна истечь в конце сеанса (ожидаемое поведение), но браузер может увидеть, что она уже истекла (все еще хорошо) или никогда не истечет (действительно плохо). Не все браузеры написаны одинаково.
Также, если обратный вызов onbeforeunload
не запущен, срок действия файла cookie не истек, но он будет оставаться активным в течение 30 дней в течение checkCookie()
. Вы можете установить срок действия файла cookie через 20 минут (0.0125
дней). Вот как сеансы обрабатываются на стороне сервера. Если сокет закрывается и сеанс простаивает в течение 20 минут (по умолчанию время ожидания простоя сеанса), данные сеанса удаляются.
Надеюсь, это поможет.