2010-02-05 163 views
13

我们有一个遗留应用程序(经典ASP和ASP.net的混合体),它有几个Ajax内容丰富的页面。期望的是,该网站的用户在页面上执行一组任务,可以跨越相当长的时间,例如15-30分钟。使用javascript重置元标记以防止刷新页面

其中一项要求是登录到站点的用户在15分钟不活动后自动注销。目前正在通过使用元标记将用户重定向到注销页面15分钟后,在页面中处于非活动状态。

<meta name='Refresh' http-equiv="Refresh" content="900;URL=/someurl/logout.asp">

我们遇到的问题是,浏览器犯规认为已经在页面上的任何活动,尽管有与服务器的许多AJAX交互。因此,在浏览器认为处于非活动状态的15分钟后,即使用户正在做某事,用户也会自动注销。

这个message board post的启发,我们试图通过使用javascript(JQuery的),像这样

下面来解决烦恼将是一个事件处理程序等的节约为简单起见这里的页面点击等在页面加载修改刷新时间到5秒

$(document).ready(function() { 
    var selector = 'meta[name=Refresh]'; 
    var content = $(selector).attr("content"); //"900;URL=/someurl/logout.asp" 
    $(selector).attr("content", "5;URL=/someurl/logout.asp"); 
}); 

意图正在(重新)设置元标记内容的页面刷新计时器将被重置。不幸的是,这似乎并没有工作(在IE中)。

由于这是一个传统的应用程序,所以一些决定即使用元标签等都会被烘焙。问题是,有没有办法让元标签刷新和平共存于Ajax应用程序?我做错了什么,有没有办法解决这个问题?

+1

元刷新与活动无关 - 如果将其设置为15分钟,则无论活动如何,都将刷新15分钟。 – Matt 2010-02-05 20:29:24

+0

看到可能的重复:http:// stackoverflow。com/questions/262305/how-can-i-update-meta-refresh-from-javascript-when-as-asyncronous-calls – Matt 2010-02-05 20:34:54

+0

@Matt,by activity我的意思是这个页面没有被重新加载。当我们谈论一个经典的asp应用时,我认为它的含义是在每个帖子上重新加载页面。 – 2010-02-05 21:54:04

回答

7

假设你正在使用jQuery这样的事情可能会奏效。我没有测试过它,也不知道浏览器是否会读取文档头中的noscript元素中的meta标签。

这个替换您的meta标签:

<script type="text/javascript"> 
    window.onload = function(){ 
     var timer = null, 
      time=1000*60*15, // 15 minutes 
      checker = function(){ 
       if(timer){clearTimeout(timer);} // cancels the countdown. 
       timer=setTimeout(function() { 
        document.location="/someurl/logout.asp"; 
       },time); // reinitiates the countdown. 
      }; 
     checker(); // initiates the countdown. 
     // requires jQuery... (you could roll your own jQueryless version pretty easily though) 
     if(window.jQuery){ 
      // bind the checker function to user events. 
      jQuery(document).bind("mousemove keypress click", checker); 
     } 
    }; 
</script> 
<noscript> 
    <meta name="Refresh" http-equiv="Refresh" content="900;URL=/someurl/logout.asp"> 
</noscript> 

肯定有这样做的更好的方法。就像服务2页...一个用户与JavaScript和一个没有。

或者只是禁用没有JavaScript的人的应用程序。 :O)

编辑 根据这个页面:http://www.google.com/support/forum/p/Webmasters/thread?tid=25c023fea4ea60a4&hl=en元刷新应该无脚本元素在里面工作。

+0

伟大的代码,但你错过了一个“{”在函数()看到下面 – 2017-06-13 01:27:11

0

我不认为有一种方法可以停止元刷新。您可以更改元标记,但浏览器已经决定在15分钟内刷新;没有API可以阻止它。

如果你不能停止刷新或使用JavaScript做重定向,也许可以遏制损害:

$(window).unload(function() { 
    // Insert code here 
    // to save the user's work. 
    alert('Sorry, you have to log out now.') 
});