Bookmarklet以防止在网站上自动注销

时间:2013-11-07 17:26:50

标签: javascript bookmarklet

我正在使用一个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)浏览器选项卡中运行(如果我用应用程序打开一个新选项卡也是如此)并连续检查?顺便说一下,我无法安装任何浏览器扩展。与网页交互的唯一方法是通过书签。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我猜这是你的问题:

  1. 您运行书签,它可以防止在当前页面上注销。
  2. 您右键单击或按住Ctrl键并单击当前页面上的链接以打开新选项卡,该新选项卡最终会将您注销。
  3. 可能的解决方案:除了当前代码之外,bookmarklet还在页面中的每个链接上附加了一个click事件侦听器。如果侦听器检测到CTRL +单击,则会阻止默认操作,window.open,然后修改新选项卡中的代码。

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

    我想知道的一件事是,如果您将页面打开很长时间没有任何活动,那么您当前的解决方案是否真的有效。无论您在客户端进行哪些修改,服务器都可能有自己的内部会话超时。如果是这样,可以使用通过AJAX进行良性背景页面获取的计时器来防止这种情况。

答案 2 :(得分:1)

超时有两个部分。首先是AlertUser超时,在58分30秒后触发。第二个是服务器上的会话超时,显然可以通过向/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);

这应该删除所有超时。您可能认为我们可以在clearTimeout之外执行setInterval,您可能是对的。但是页面上可能存在重置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);