sessionStorage браузера. доля между вкладками? [дубликат]



этот вопрос уже есть ответ здесь:



У меня есть некоторые значения на моем сайте, которые я хочу очистить, когда браузер закрыт, я выбрал sessionStorage для хранения этих значений, это ясно, когда вкладка закрыта и продолжает хранить, если пользователь нажимает f5, но если пользователь открывает некоторую ссылку в другая вкладка эти значения недоступны. Как я могу поделиться значениями sessionStorage между всеми вкладками браузера с моим приложением?



вариант использования: поместите значение в некоторое хранилище, сохраните это значение доступным во всех вкладках браузера и очистите его, если все вкладки закрыты.



if (!sessionStorage.getItem(key)) {
sessionStorage.setItem(key, defaultValue)
}
595   6  

6 ответов:

вы можете использовать localStorage и его eventListener "storage" для передачи данных sessionStorage с одной вкладки на другую.

этот код должен существовать на всех вкладках. Он должен выполняться перед другими сценариями.

// transfers sessionStorage from one tab to another
var sessionStorage_transfer = function(event) {
  if(!event) { event = window.event; } // ie suq
  if(!event.newValue) return;          // do nothing if no value to work with
  if (event.key == 'getSessionStorage') {
    // another tab asked for the sessionStorage -> send it
    localStorage.setItem('sessionStorage', JSON.stringify(sessionStorage));
    // the other tab should now have it, so we're done with it.
    localStorage.removeItem('sessionStorage'); // <- could do short timeout as well.
  } else if (event.key == 'sessionStorage' && !sessionStorage.length) {
    // another tab sent data <- get it
    var data = JSON.parse(event.newValue);
    for (var key in data) {
      sessionStorage.setItem(key, data[key]);
    }
  }
};

// listen for changes to localStorage
if(window.addEventListener) {
  window.addEventListener("storage", sessionStorage_transfer, false);
} else {
  window.attachEvent("onstorage", sessionStorage_transfer);
};


// Ask other tabs for session storage (this is ONLY to trigger event)
if (!sessionStorage.length) {
  localStorage.setItem('getSessionStorage', 'foobar');
  localStorage.removeItem('getSessionStorage', 'foobar');
};

Я тестировал это в chrome, ff, safari, ie 11, ie 10, ie9

этот метод "должен работать в IE8", но я не мог проверить его, так как мой IE падал каждый раз, когда я открывал вкладку.... любая вкладка... на любом сайте. (т. е. добрые) ЗЫ: ты очевидно, что нужно включить JSON-прокладку, если вы также хотите поддержку IE8. :)

это Полная статья: http://blog.guya.net/2015/06/12/sharing-sessionstorage-between-tabs-for-secure-multi-tab-authentication/

используя sessionStorage ибо это невозможно.

С MDN Docs

открытие страницы в новой вкладке или окне приведет к созданию нового сеанса инициированный.

это означает, что вы не можете делиться между вкладками, для этого вы должны использовать localStorage

  1. вы можете просто использовать localStorage и помните дату, когда он был впервые создан в session cookie. Когда localStorage "сессия" старше, чем значение cookie, то вы можете очистить localStorage

    минусы этого заключается в том, что кто-то все еще может читать данные после закрытия браузера, поэтому это не хорошее решение, если ваши данные являются частными и конфиденциальными.

  2. вы можете хранить ваши данные в localStorage на пару секунд и добавить прослушиватель событий для storage событие. Таким образом, вы будете знать, когда любой из вкладок написал что-то в localStorage и вы можете скопировать его содержимое в папку sessionStorage, тогда просто очистите localStorage

на самом деле глядя на другие области, если вы открываете с _blank он сохраняет sessionStorage до тех пор, как вы открываете вкладку, когда родитель открыт:

в этой ссылке, есть хороший jsfiddle, чтобы проверить его. sessionStorage в новом окне не пуст, при переходе по ссылке с target= "_blank"

мое решение не иметь sessionStorage, переносимого через вкладки, состояло в том, чтобы создать localProfile и отключить эту переменную. Если эта переменная установлена, но мои переменные sessionStorage не идут вперед и повторно инициализируют их. Когда пользователь выходит из окна закрывается уничтожить эту переменную localStorage

вот решение для предотвращения сдвига сеанса между вкладками браузера для приложения java. Это будет работать для IE (JSP / Servlet)

  1. на первой странице JSP, onload событие вызов сервлета (ajex вызов) для установки "окно.название " и отслеживание событий в сеансе (только целочисленная переменная, которая будет установлена как 0 в первый раз)
  2. убедитесь, что ни одна из других страниц не устанавливает окно.название
  3. все страницы (включая первую страницу) добавьте скрипт java для проверки заголовок окна после завершения загрузки страницы. если заголовок не найден, закройте текущую страницу / вкладку (обязательно отмените "окно.выгрузить " функция, когда это происходит)
  4. установить окне страницы.onunload java script event (для всех страниц) чтобы захватить событие обновления страницы, если страница была обновлена вызовите сервлет для сброса отслеживания событий.

1) первая страница JS

BODY onload="javascript:initPageLoad()"

function initPageLoad() {
    var xmlhttp;

    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {
        // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {                           var serverResponse = xmlhttp.responseText;
            top.document.title=serverResponse;
        }
    };
                xmlhttp.open("GET", 'data.do', true);
    xmlhttp.send();

}

2) общие JS для всех страниц

window.onunload = function() {
    var xmlhttp;
    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {
        // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {             
            var serverResponse = xmlhttp.responseText;              
        }
    };

    xmlhttp.open("GET", 'data.do?reset=true', true);
    xmlhttp.send();
}

var readyStateCheckInterval = setInterval(function() {
if (document.readyState === "complete") {
    init();
    clearInterval(readyStateCheckInterval);
}}, 10);
function init(){ 
  if(document.title==""){   
  window.onunload=function() {};
  window.open('', '_self', ''); window.close();
  }
 }

3) web.xml-сервлет отображение

<servlet-mapping>
<servlet-name>myAction</servlet-name>
<url-pattern>/data.do</url-pattern>     
</servlet-mapping>  
<servlet>
<servlet-name>myAction</servlet-name>
<servlet-class>xx.xxx.MyAction</servlet-class>
</servlet>

4)код сервлета

public class MyAction extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException {
    Integer sessionCount = (Integer) request.getSession().getAttribute(
            "sessionCount");
    PrintWriter out = response.getWriter();
    Boolean reset = Boolean.valueOf(request.getParameter("reset"));
    if (reset)
        sessionCount = new Integer(0);
    else {
        if (sessionCount == null || sessionCount == 0) {
            out.println("hello Title");
            sessionCount = new Integer(0);
        }
                          sessionCount++;
    }
    request.getSession().setAttribute("sessionCount", sessionCount);
    // Set standard HTTP/1.1 no-cache headers.
    response.setHeader("Cache-Control", "private, no-store, no-cache, must-                      revalidate");
    // Set standard HTTP/1.0 no-cache header.
    response.setHeader("Pragma", "no-cache");
} 
  }

Comments

    Ничего не найдено.