Использование javascript для проверки связи с веб-приложением, чтобы держать сеанс открытым - PullRequest
16 голосов
/ 11 мая 2009

Я пишу скрипт greasemonkey, чтобы сеанс оставался открытым в веб-приложении, которое я использую для работы. Какую команду javascript вы бы использовали для создания обратной связи с сервером и обеспечения того, чтобы сеанс не прерывался, не отвлекая пользователя от полного обновления страницы?

Ответы [ 6 ]

24 голосов
/ 11 мая 2009

Я решил проблему, используя:

function keepAlive() {
    var httpRequest = new XMLHttpRequest();
    httpRequest.open('GET', "/restricted_file_url");
    httpRequest.send(null);
}

setInterval(keepAlive, 840000);  //My session expires at 15 minutes
3 голосов
/ 11 мая 2009

Второй выбор

Если вы абсолютно настаиваете на использовании Greasemonkey, любой метод element.click() для любого события, отправляющего запрос XMLHTTP, должен подойти.

Первый выбор

Если вы готовы использовать решение, которое не требует написания сценария Greasemonkey:

ReloadEvery 3.0.0, автор Jaap Haitsma

Это перезагружает веб-страницы каждые столько секунд или минут. Функция доступна через контекстное меню (меню, которое появляется при щелчке правой кнопкой мыши на веб-странице) или из раскрывающегося меню на кнопке перезагрузки.

Это не то, что вы просили, но если вы просто не хотите освежить свои навыки работы с javascript, это, вероятно, самый простой метод решения вашей проблемы.

2 голосов
/ 30 августа 2016

Используя несколько советов из ответа Джесси, вот полный код.

Вам необходимо обновить параметр @match с доменом вашего сайта

// ==UserScript==
// @name         Auto session extender
// @namespace    http://obive.net/
// @version      0.2
// @description  Automatically extend server-side session
// @author       Charlie Hayes
// @match        http://obive.net/
// @grant   GM_getValue
// @grant   GM_setValue
// @noframes
// ==/UserScript==

(function() {
    'use strict';

    console.log('The session for this site will be extended automatically via userscript.');

    var minute = 60*1000;
    var refreshTime = 15 * minute;

    var iframe = document.createElement("iframe");
    iframe.style.width = 0;
    iframe.style.height=0;

    var loc = window.location;
    var src = loc.protocol +'//' + loc.host + loc.pathname;
    src += loc.search ? (loc.search + '&') : '?';
    src +=  'sessionextendercachebuster=';

    var reloadIframe = function(){
        var time = new Date().getTime();
        var lastRefresh = GM_getValue('lastRefresh');
        var timeSinceLastRefresh = time - lastRefresh;
        if (!lastRefresh || timeSinceLastRefresh > refreshTime - minute) {
            console.log('Auto-extending session');
            iframe.src = src + time;
            GM_setValue('lastRefresh',time);
            setTimeout(reloadIframe, refreshTime);

            setTimeout(function(){
                // Unload the iframe contents since it might be taking a lot of memory
                iframe.src='about:blank';
            },10000);
        }else{
            console.log('Another tab/window probably refreshed the session, waiting a bit longer');
            setTimeout(reloadIframe, refreshTime - timeSinceLastRefresh - minute);
        }
    };
    setTimeout(reloadIframe, refreshTime);
    document.body.appendChild(iframe);
})();
2 голосов
/ 11 мая 2009

Если вы хотите написать JavaScript для решения этой проблемы (другие ответы намного проще, и я бы порекомендовал пойти по более простому пути), вот что я бы сделал:

  • Вызовите document.createElement ("iframe") для создания iframe
  • Увеличьте размер iframe до 0x0, style.display = "none", задайте для идентификатора что-то и задайте для свойства src страницу на сайте, которая расширит ваш сеанс
  • Используйте document.body.appendChild, чтобы добавить iframe на страницу
  • Используя setTimeout, обновите iFrame с помощью window.frames ['iframeID']. Location.reload (true); а также вызовите setTimeout, чтобы снова обновить страницу.

Посмотрите, сработают ли другие ответы, потому что использование JavaScript, похоже, доставит больше хлопот, чем стоит.

1 голос
/ 11 мая 2009

Я определенно могу порекомендовать решение, предложенное dreftymac!

Если вы не хотите беспокоиться о том, что не забыли щелкнуть опцию reloadevery, ваш скрипт обезжиренной обезьяны просто

window.location.href = window.location.href
0 голосов
/ 11 мая 2009

Это предполагает, что вы не хотите, чтобы страница постоянно обновлялась, как советуют другие.

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

Однако , ваша проблема (я полагаю) должна получить доступ к некоторой ограниченной области веб-сайта, чтобы поддерживать активную сессию ... в этом случае (и тот факт, что вы можете ' t ping), найдите страницу с «ограниченным доступом» и выполните Ajax-вызов или подобное. Не цитируйте меня по этому поводу, потому что я ни в коем случае не эксперт по JavaScript ... просто выкидываю потенциальное решение.

...