21

我正在编写一个greasemonkey 脚本以在我用于工作的webapp 上保持会话打开。您将使用哪个 javascript 命令与服务器创建一些反馈并确保会话不会失败,而不必打扰用户完全刷新页面?

4

6 回答 6

27

我已经使用以下方法解决了这个问题:

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

setInterval(keepAlive, 840000);  //My session expires at 15 minutes
于 2009-05-11T18:47:30.993 回答
3

第二选择

如果您绝对坚持使用 Greasemonkey,element.click()那么提交 XMLHTTPrequest 的任何事件上的任何方法都应该这样做。

第一选择

如果您愿意使用不需要您编写 Greasemonkey 脚本的解决方案:

ReloadEvery 3.0.0,作者 Jaap Haitsma

这会每隔几秒或几分钟重新加载一次网页。该功能可通过上下文菜单(右键单击网页时获得的菜单)或通过重新加载按钮上的下拉菜单访问。

这不是您所要求的,但除非您只是想提高您的 javascript 技能,否则这可能是解决您的问题的最直接的方法。

于 2009-05-11T17:22:57.590 回答
3

使用 Jesse 的回答中的一些提示,这是完整的代码。

您将需要@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);
})();
于 2016-08-30T19:04:36.940 回答
2

如果你想编写 JavaScript 来解决这个问题(其他答案要容易得多,我建议你走更简单的路线),这就是我要做的:

  • 调用 document.createElement("iframe") 创建一个 iframe
  • 将 iframe 的大小设置为 0x0,style.display = "none",将 ID 设置为某个值,并将 src 属性设置为站点上将扩展您的会话的页面
  • 使用 document.body.appendChild 将 iframe 添加到页面
  • 使用 setTimeout 刷新 iFrame 使用 window.frames['iframeID'].location.reload(true); 并调用 setTimeout 再次刷新页面。

看看其他答案是否可行,因为使用 JavaScript 似乎比它的价值更麻烦。

于 2009-05-11T17:42:49.600 回答
1

我绝对可以推荐 dreftymac 建议的解决方案!

如果您不想担心记住单击 reloadevery 选项,那么您的油脂猴子脚本很简单

window.location.href = window.location.href
于 2009-05-11T17:26:13.060 回答
0

这是假设您 想像其他人建议的那样保持页面不断刷新。

通常,如果您只是想对服务器进行 ping 操作,您可能最好执行一些操作,例如使用您知道远程服务器上存在的图像,并检查它的高度 - 从而产生流量。

但是,您的问题(我认为)需要访问网站的某些有限区域,以保持会话处于活动状态......在这种情况下(以及您无法直接 ping 的事实),找到一个页面是“受限制的”并进行 Ajax 调用或类似调用。不要引用我的话,因为我绝不是 JavaScript 专家......只是抛出一个潜在的解决方案。

于 2009-05-11T17:26:36.867 回答