Подтвердить что ты не робот

Как иметь отдельные sessionStorages для iframe одного и того же происхождения

В стандартном стандарте W3C говорится о локальных хранилищах:

Различные авторы используют одно имя хоста, например, пользователи, размещающие контент на geocities.com, все используют один локальный объект хранения. Нет возможности ограничить доступ по имени пути. Поэтому авторы на общих хостах должны избегать использования этих функций, так как другим авторам было бы тривиально читать данные и перезаписывать их.

Но для sessionStorages он сказал, что он предоставляет отдельные sessionStorages для вкладок и окон даже из одного источника.

Но похоже, что iframes действительно разделяет sessionStorage.

Есть ли способ иметь отдельные сеансовые записи с помощью iframes в одном и том же источнике.

Изменить: Поскольку возникла путаница, если вкладки/окна имеют отдельные sessionStorages, вот примерная страница. Сохраните код в файле и откройте его двумя разными вкладками. Затем обновите одну вкладку 5 раз и обновите другую вкладку 1 раз. Вы увидите, что цифры отличаются.

<!DOCTYPE html>
<html>
<body>
    <div id="result"></div>
    <script>
        sessionStorage.setItem("counter", (parseInt(sessionStorage.getItem("counter"), 10) || 0 ) + 1);
        document.getElementById("result").innerHTML = sessionStorage.getItem("counter");
    </script>
</body>
</html>

Edit2: Я пытался использовать атрибут iframe sandbox. Но потом я получил ошибку в iframe, и я не могу использовать sessionStorage вообще. Мне пришлось добавить sandbox="allow-same-origin". Но затем sessionStorage снова во всех iframe.

Спасибо заранее.

4b9b3361

Ответ 1

@adeneo является правильным при указании

контейнер хранения установлен в исходный домен, а iframes из одно и то же происхождение имеет один и тот же объект, даже если iFrame открывает новый Сессия

Обходной путь в настоящее время не существует

<!DOCTYPE html>
<html>
<body>
    <iframe name="one" src="sessionStorageTest.html"></iframe>
    <iframe name="two" src="sessionStorageTest1.html"></iframe>
</body>
</html>

sessionStorageTest.html

<!DOCTYPE html>
<html>
<body>
    <div id="result"></div>
    <script>
        sessionStorage.setItem("counter", (parseInt(sessionStorage.getItem("counter"), 10) || 0 ) + 1);
        document.getElementById("result").innerHTML = sessionStorage.getItem("counter");
    </script>
</body>
</html>

sessionStorageTest1.html

<!DOCTYPE html>
<html>
<body>
    <div id="result"></div>
    <script>
        var i = 0;
          while (++i < 10) {
            sessionStorage.setItem("counter", (parseInt(sessionStorage.getItem("counter"), 10) || 0 ) + 1);
            document.getElementById("result").innerHTML = sessionStorage.getItem("counter");
          }
    </script>
</body>
</html>

демонстрируется в plnkr http://plnkr.co/edit/Etel4ToABM6gWOw6qAE5?p=preview

Ответ 2

Существует обходное решение, если у вас есть ssl. Использование https://... для доступа к одному документу и http://... для доступа к другому будет создавать отдельные хранилища для одного и того же источника.