Мы используем зашифрованные куки, чтобы сохранить сеанс пользователя активным на нескольких вкладках.
Если пользователь закрывает браузер, куки удаляются без каких-либо хлопот. Однако, если у пользователя открыты 2 вкладки, одна из которых является вкладкой приложения, а другая - вкладкой какого-то произвольного сайта, и пользователь закрывает вкладку приложения, куки-файлы все еще сохраняются, когда пользователь открывает новую вкладку приложения, и, таким образом, сеанс пользователя. все еще активен и не вынуждает его войти снова.
Поэтому я думаю следующее:
- Следите за открытыми вкладками, сохраняя значение счетчика в браузере. файлы cookie.
- Увеличение размера файла cookie при открытии новой вкладки
- Уменьшение размера файла cookie при закрытии вкладки
- Оставить количество файлов cookie без изменений при обновлении браузера
Для пунктов 2 - 4 я использую свойства window.performance.navigation.type
, чтобы определить, была ли загружена или обновлена вкладка. Когда вкладка открывается сначала, navigation.type
правильно указывает тип 0
, который равен TYPE_NAVIGATE
. Однако, если обновляется та же вкладка, тип по-прежнему показывает значение 0 и только после второго обновления корректно переключается на 1, то есть TYPE_RELOAD
. Таким образом, неправильная интерпретация между 0 и 1 приводит к неправильному вычислению файла cookie.
Ниже приведен мой код, возможно, любая идея или отзыв о том, что идет не так, или, возможно, рекомендации по лучшему способу определения, еслипоследняя вкладка была закрыта?
var checkTabs = function () {
//This method gets called at the start of the application
var isRefresh = window.performance.navigation.type === window.performance.navigation.TYPE_RELOAD;
//The getCookie and setCookie methods are custom functions to retrieve a browser cookie and its value, and set the retrieved cookie value.
var tabCookie = getCookie({ name: "WS:T" });
//If the cookie is not found, we create a new cookie with an initialized value of 0
if (!tabCookie)
tabCookie = { name: "WS:T", value: 0 };
var increment = tabCookie.value;
//If the navigation type is a navigate and not a refresh, we increment the cookie value
if (!isRefresh)
increment = parseInt(tabCookie.value, 10) + 1;
setCookie({ name: "WS:T", value: increment, expiry: moment().subtract(1, "days").format("YYYY-MM-DD HH:mm") });
};
Прослушиватель beforeunload
добавляется к объекту окна и ссылается на метод ниже:
var beforeUnloadTab = function (e) {
var isRefresh = window.performance.navigation.type === window.performance.navigation.TYPE_RELOAD;
if (!isRefresh) {
//Only decrement the cookie if the tab is closed and not refreshed.
var tabCookie = getCookie({ name: "WS:T" });
var decrement = parseInt(tabCookie.value, 10) - 1;
if (decrement === 0) {
//If the last tab is being closed, perform the necessary clearing of all session values etc.
}
setCookie({ name: "WS:T", value: decrement, expiry: moment().subtract(1, "days").format("YYYY-MM-DD HH:mm") });
}
};