我正在编写一个greasemonkey 脚本以在我用于工作的webapp 上保持会话打开。您将使用哪个 javascript 命令与服务器创建一些反馈并确保会话不会失败,而不必打扰用户完全刷新页面?
6 回答
我已经使用以下方法解决了这个问题:
function keepAlive() {
var httpRequest = new XMLHttpRequest();
httpRequest.open('GET', "/restricted_file_url");
httpRequest.send(null);
}
setInterval(keepAlive, 840000); //My session expires at 15 minutes
第二选择
如果您绝对坚持使用 Greasemonkey,element.click()
那么提交 XMLHTTPrequest 的任何事件上的任何方法都应该这样做。
第一选择
如果您愿意使用不需要您编写 Greasemonkey 脚本的解决方案:
ReloadEvery 3.0.0,作者 Jaap Haitsma
这会每隔几秒或几分钟重新加载一次网页。该功能可通过上下文菜单(右键单击网页时获得的菜单)或通过重新加载按钮上的下拉菜单访问。
这不是您所要求的,但除非您只是想提高您的 javascript 技能,否则这可能是解决您的问题的最直接的方法。
使用 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);
})();
如果你想编写 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 似乎比它的价值更麻烦。
我绝对可以推荐 dreftymac 建议的解决方案!
如果您不想担心记住单击 reloadevery 选项,那么您的油脂猴子脚本很简单
window.location.href = window.location.href
这是假设您 不 想像其他人建议的那样保持页面不断刷新。
通常,如果您只是想对服务器进行 ping 操作,您可能最好执行一些操作,例如使用您知道远程服务器上存在的图像,并检查它的高度 - 从而产生流量。
但是,您的问题(我认为)需要访问网站的某些有限区域,以保持会话处于活动状态......在这种情况下(以及您无法直接 ping 的事实),找到一个页面是“受限制的”并进行 Ajax 调用或类似调用。不要引用我的话,因为我绝不是 JavaScript 专家......只是抛出一个潜在的解决方案。