Хранилище сессии не сбрасывается при закрытии iFrame - PullRequest
1 голос
/ 05 февраля 2020

Проблема, с которой я сталкиваюсь, заключается в том, что при закрытии iframe и повторном открытии другого iframe с тем же местом назначения, сессия sessionStorage все еще заполняется из последнего iframe, который я открыл. Я ожидал, что sessionstorage будет сброшен и снова запустит fre sh.

У меня есть свой iframe в его собственном компоненте, который я отображаю в стиле модального всплывающего окна. При закрытии модального режима я убедился, что вызывается функция onDestroy, и кажется, что компонент разрушается, а iframe должен удаляться из DOM.

Я также пытался специально получить iframe по id и удалить его из parentNode в функции onDestroy, только если он не был удален должным образом, но это все равно не имело значения.

I также попытался использовать событие beforeunload и очистить хранилище сеанса до закрытия страницы в iframe ... Но при закрытии диалогового окна (компонента), содержащего iframe, создается впечатление, что событие не запускается или не запускается обработчик , Ниже приведен код, который я использую для обработки события beforeunload (angular):

  @HostListener('window:beforeunload', ['$event'])
  unloadNotification($event: any) {
    console.log("unload event");
  }

Можно ли как-нибудь принудительно очистить хранилище сеанса при закрытии iframe? Является ли это ошибкой в ​​функционировании sessionstorage или это ожидаемое поведение при использовании sessionStorage?

Ответы [ 3 ]

4 голосов
/ 11 февраля 2020

Согласно документации , это ожидаемое поведение sessionStorage. Он ограничен вкладкой / окном браузера, разделен по доменам и очищается при закрытии браузера или вкладки. Но iframe по определению не является ни вкладкой браузера, ни окном, хотя он может действительно указывать на другой домен. «Естественным» способом очистки было бы закрытие браузера / вкладки.

Для этого программным путем одним из решений было бы сообщить фрейму iframe, что модальное окно приложения закрывается через window.postMessage. Таким образом, приложение, загруженное в iframe, может очистить хранилище самостоятельно. Но вы не сможете изменить код приложения в iframe.

Другим решением будет обслуживание приложения iframe в том же домене, что и основное приложение, через обратный прокси-сервер. Затем хранилище будет разделено между двумя приложениями, и вы сможете очистить его при вызове вашего модального метода onDestroy:

onDestroy() {
  sessionStorage.clear();
}
1 голос
/ 10 февраля 2020

Вы пытались запустить

window.sessionStorage.clear;

изнутри вашего жизненного цикла методом onDestroy?

Не стесняйтесь переместить этот ответ в комментарий, если это необходимо.

0 голосов
/ 11 февраля 2020

Как насчет очистки при загрузке страницы?

...