书签,以防止在网站上自动注销

Bookmarklet to prevent auto-logout on website

本文关键字:注销 网站 书签      更新时间:2023-09-26

我正在使用一个Web应用程序,该应用程序在一定数量的不活动后自动将您注销。我无法控制该应用程序。应用程序用于注销的相关代码如下:

var windoc = window.document;
var timeoutID;
function AlertUser() {
    var msg = 'Session expires in 90 seconds. Continue with this session?';
    var preConfirmTime = new Date();
    if (confirm(msg)) {
        var postConfirmTime = new Date();
        if (postConfirmTime.getTime() - preConfirmTime.getTime() > 90000) {
            alert('Sorry, your session has already expired.');
          window.location = '/Logout.aspx';
        } else {
           var img = new Image(1,1);
           img.src = '/Reconnect.aspx';
           timeoutID = window.setTimeout('AlertUser()','3510000'); 
        }
    } else {
      window.location = '/Logout.aspx';
    }
}
function ResetTimeout(delay) {
    window.clearTimeout(timeoutID);
    timeoutID = window.setTimeout('AlertUser()', delay);
}
timeoutID = window.setTimeout('AlertUser()','3510000');

由于注销确实破坏了我的工作流程,因此我希望有一个书签,以便在会话即将过期时确认OK。我想我可能会使用

javascript:window.confirm = function(){return true;};

但这仅在我单击书签时运行。有没有办法让它自动在活动(IE 10)浏览器选项卡中运行(如果我使用应用程序打开一个新选项卡也是如此)并使其持续检查?顺便说一句,我无法安装任何浏览器扩展程序。与网页交互的唯一方法是通过书签。

如果您可以在本地安装其他程序,请使用Charles Proxy之类的程序(使用其"重写"工具)在应用程序交付到浏览器时对其进行更改。只要 Charles 处于打开状态,就可以指定此重写规则始终应用于此应用程序。

我猜这是你的问题:

  1. 您运行书签,它会阻止在当前页面上注销。
  2. 右键单击或 ctrl+单击当前页面上的链接以打开一个新选项卡,该新选项卡最终会将您注销。

可能的解决方案:除了当前代码之外,书签还在页面中的每个链接上附加一个单击事件侦听器。如果侦听器检测到 CTRL+单击,则会阻止默认操作,执行window.open,然后修改新选项卡中的代码。

为了防止在同一选项卡中重新加载或导航时当前窗口中出现相同的问题,bookmaklet 可以打开一个小子窗口来监控其parent。如果监视器检测到父级不再被正确修改,它可以重新应用代码。

我想知道的一件事是,如果您长时间打开页面而没有活动,您当前的解决方案是否真的有效。服务器可能有自己的内部会话超时,无论您在客户端进行何种修改,都会发生该超时。如果是这样,可以通过通过 AJAX 执行良性后台页面提取的计时器来防止这种情况。

超时有两个部分。首先是 58 分 30 秒后触发的AlertUser超时。第二个是服务器上的会话超时,显然可以通过向/Reconnect.aspx发出GET请求来刷新。

ResetTimeout函数为我们提供了有关如何处理AlertUser超时的线索,但它不处理服务器端会话超时。因此,以此为起点,我们可以这样做:

setInterval(function(){
    clearTimeout(timeoutID);     // stop the AlertUser from happening
    var img = new Image(1,1);
    img.src = '/Reconnect.aspx'; // stop server session from expiring
},15*60*1000);

这应该删除所有超时。你可能认为我们可以在setInterval之外做clearTimeout,你可能是对的。但是页面上可能有重置AlertUser超时的代码,因此在循环中执行此操作可以让您重新清除它以防万一。

setInterval每 15 分钟 (15*60*1000) 运行一次,是页面超时 58 分钟的 4 倍。但以防万一页面超时值发生变化,您可以将 15 分钟更改为另一个数字。不要太频繁地这样做,否则该网站可能会将您列入垃圾邮件的黑名单。

此外,上面的代码不会保护,以防您不小心加载书签两次。您可以通过首先清除任何以前的setInterval来使其更安全:

if (typeof anti_timeout != 'undefined') {
    clearInterval(anti_timeout);   // clear previous anti-timeout timer
}
anti_timeout = setInterval(function(){
    clearTimeout(timeoutID);
    var img = new Image(1,1);
    img.src = '/Reconnect.aspx';
},15*60*1000);