Как проверить, закрыта ли последняя вкладка браузера приложения - PullRequest
2 голосов
/ 02 октября 2019

Мы используем зашифрованные куки, чтобы сохранить сеанс пользователя активным на нескольких вкладках.

Если пользователь закрывает браузер, куки удаляются без каких-либо хлопот. Однако, если у пользователя открыты 2 вкладки, одна из которых является вкладкой приложения, а другая - вкладкой какого-то произвольного сайта, и пользователь закрывает вкладку приложения, куки-файлы все еще сохраняются, когда пользователь открывает новую вкладку приложения, и, таким образом, сеанс пользователя. все еще активен и не вынуждает его войти снова.

Поэтому я думаю следующее:

  1. Следите за открытыми вкладками, сохраняя значение счетчика в браузере. файлы cookie.
  2. Увеличение размера файла cookie при открытии новой вкладки
  3. Уменьшение размера файла cookie при закрытии вкладки
  4. Оставить количество файлов 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") });
        }
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...