我们有一个遗留应用程序(经典ASP和ASP.net的混合),它有一些Ajax内容丰富的页面。期望网站的用户在页面上执行一组可以跨越相当数量的任务时间说,15-30分钟。
其中一个要求是登录到站点的用户在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应用程序和平共存?我做错了什么,有办法解决这个问题吗?
答案 0 :(得分:7)
假设您正在使用jQuery这样的东西可能会起作用。我没有测试它,也不知道浏览器是否会读取文档头中noscript元素中的元标记。
将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元刷新应该在noscript元素内部工作。
答案 1 :(得分:0)
我认为没有办法阻止元刷新。您可以更改元标记,但浏览器已经确定它将在15分钟内刷新;没有API可以阻止它。
如果您无法停止刷新或使用JavaScript进行重定向,也许您可以包含损坏:
$(window).unload(function() {
// Insert code here
// to save the user's work.
alert('Sorry, you have to log out now.')
});