Как использовать установленный тайм-аут с использованием приставки - PullRequest
0 голосов
/ 01 ноября 2018

Мне нужно вывести предупреждение до истечения 5 минут истечения срока действия токена. Я уже попробовал это решение.

showTokenExpiryAlert() {
    /* Convert expiresIn (seconds) to expiresIn (miliseconds) */
    const expiresIn = this.expiresIn * 1000;

    /* calculate alert time from expiresIn (miliseconds) */
    const alertTime = expiresIn - 300000;

    /* Show alert message before 5 mins of token expiry time */
    setTimeout(() => {
      alert('Token will be exppired soon');
    }, alertTime);
  }

Этот код работает нормально. Но это не удается при обновлении страницы. Итак, я думаю использовать избыточность, но не могу найти точное решение, как использовать для этого избыточность.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Первое, что вы должны сделать, это переместить логику отображения предупреждения об истечении срока действия внутри компонента, который всегда существует (скажем, header-component), но активируется только после успешного входа в систему. Ваш компонент входа в систему устанавливает время истечения в localStorage после успешного входа в систему и устанавливает флаг, чтобы можно было инициализировать headerComponent. Ваш компонент заголовка читает значение из localStorage и запускает таймер.

showTokenExpiryAlert() {
    /* Convert expiresIn (seconds) to expiresIn (miliseconds) */
    const expiresIn = localStorage.getItem('expiresIn') * 1000;

    /* calculate alert time from expiresIn (miliseconds) */
    const alertTime = expiresIn - 300000;

    if (alertTime > 0) {
        /* Only show the alert if the token hasn't already expired */
        setTimeout(() => {
          alert('Token will be exppired soon');
        }, alertTime);
    }
    else {
       localStorage.removeItem('expiresIn');  // token already expired
       // navigate to login
    }
  }

Не используйте SessionStorage вместо localStorage, это будет очищено при закрытии браузера.

0 голосов
/ 01 ноября 2018

Предполагается, что вы используете ngrx как реализацию Redux для Angular:

  1. По умолчанию ngrx / store сохраняет все состояния в памяти, поэтому при полной перезагрузке страницы вы в любом случае потеряете все состояние приложения, даже при использовании redux.
  2. Вы можете попытаться сохранить все состояние приложения ngrx в localStorage , но это гораздо более широкая задача, если вам нужно просто проверить, не истек ли токен

Так что может быть лучше сделать то, что @Aarsh предложил выше.

Создать сервис, который:

  1. Сохраняет время истечения в localStorage и запускает таймер
  2. Перечитывает время истечения из localStorage при запуске приложения (перезагрузка страницы) и перезапускает таймер, если время истечения уже есть
...