0

I am working in a web application which automatically logs you out after a set amount of inactivity. I have no control over the application. The relevant code the application uses to logout is here:

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');

Since the logouts are really breaking my workflow, I would like to have a bookmarklet that confirms OK whenever the session is about the expire. I thought I might use

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

But this only runs when I click the bookmarklet. Is there any way to make it run in the active (IE 10) browser tab automatically (so also if I open a new tab with the application) and make it check continuously? By the way I can not install any browser extensions. The only way of interacting with webpages is via a bookmarklet.

4

3 回答 3

1

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

于 2013-11-07T17:56:42.313 回答
1

我猜这是你的问题:

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

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

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

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

于 2013-11-08T02:22:46.037 回答
1

超时有两个部分。首先是AlertUser58 分 30 秒后触发的超时。第二个是服务器上的会话超时,显然可以通过向/Reconnect.aspx.

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超时的代码,因此在循环中执行此操作可以让您重新清除它以防万一。

setInterval15 分钟运行一次 (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);
于 2013-11-08T04:10:07.260 回答