使用JavaScript重置meta标签以防止其刷新页面

14
我们有一个遗留的应用程序(混合了经典的ASP和ASP.net),其中有一些Ajax内容丰富的页面。期望是站点的用户在页面上执行一系列任务,可能需要相当长的时间,比如15-30分钟。
其中一个要求是,在站点登录的用户在15分钟内不活动后自动注销。目前通过使用元标记来实现,即在页面上15分钟不活动后将用户重定向到注销页面。
问题在于,浏览器认为页面上没有任何活动,尽管与服务器进行了许多AJAX交互。因此,在浏览器认为的15分钟不活动之后,即使用户正在做某事,他们也会被自动注销。
消息板帖子的启发,我们尝试通过使用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
元 Refresh 与活动无关 - 如果将其设置为15分钟,则无论活动如何,它都会在15分钟时刷新。 - Matt
请参考可能的重复问题:https://dev59.com/2UXRa4cB1Zd3GeqPtq_m - Matt
@Matt,我所说的活动是指页面没有重新加载。我假设在我们谈论经典的asp应用程序时,每次发布都会重新加载页面,这是暗示的。 - Dilip Krishnan
2个回答

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>

肯定有更好的方法。比如说提供两个页面……一个供有 JavaScript 的用户使用,另一个供没有 JavaScript 的用户使用。
或者只为没有 JavaScript 的人禁用应用程序。: o) 编辑 根据这个页面:http://www.google.com/support/forum/p/Webmasters/thread?tid=25c023fea4ea60a4&hl=en,meta refresh 在 noscript 元素内应该能够工作。

代码很棒,但是你在 function() 中缺少了一个“{”,请参见下面。 - James Bailey
这是一个好的解决方案。只需补充一点 - 如果重定向应与服务器端会话过期相一致,则最好绑定到“ajaxComplete”事件。 - Calum

0

我认为无法停止meta refresh。您可以更改meta标签,但浏览器已经决定它将在15分钟后刷新;没有API可以停止它。

如果您无法停止刷新或使用JavaScript进行重定向,也许您可以遏制损害:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接