2011-04-29 96 views
0

我正在使用GWT-ext应用程序。 在这个应用程序中,我管理客户端会话。为此我写下面的代码:gwt中的会话管理

管理会话: import com.google.gwt.user.client.Timer;

public class ClientTimers { 

    private static final Timer SESSION_MAY_HAVE_EXPIRED_TIMER = new Timer() { 

     @Override 
     public void run() { 
      // Warn the user, that the session may have expired. 
      // You could then show a login dialog, etc... 
     } 
    }; 

    public static void renewSessionTimer() { 

     // First cancel the previous timer 
     SESSION_MAY_HAVE_EXPIRED_TIMER.cancel(); 

     // Schedule again in 5 minutes (maybe make that configurable?) 
     // Actually, let's subtract 10 seconds from that, because our timer 
     // won't be synchronized perfectly with the server's timer. 
     SESSION_MAY_HAVE_EXPIRED_TIMER.schedule(5 * 60 * 1000 - 10000); 
    } 
} 

要获取用户活动:

Ext.get("pagePanel").addListener("click", new EventCallback() { 
     @Override 
     public void execute(EventObject e) { 
      //MessageBox.alert("On Mouse Click"); 
    }); 

    Ext.get("pagePanel").addListener("keydown", new EventCallback() { 

     @Override 
     public void execute(EventObject e) { // 
      //MessageBox.alert("On Key Press Click"); 
     } 
    }); 

此代码工作正常,但我的问题: 此代码将做自动的时间登出了occurs.For我的代码我想上点击或键入它应该注销。情况是这样的:如果用户登录并且注销时间是5分钟。用户不按照上述代码在屏幕上执行任何活动,它将在5分钟完成时自动注销。

现在我的要求是,如果用户登录,它不会做任何事情5分钟。它不应该做任何注销自动。而不是完成5分钟注销,如果用户请点击或键下降6分钟,然后它应该做注销过程。

基本上,作为计时器超过指定时间的注销过程应该在用户活动上完成,而不是自动完成。

回答

2

在计时器中,每秒增加一个变量。 当用户在5分钟或第6分钟后点击任何按钮时,检查计数器变量,如果变量大于6,则可以使用Window.Location.reload();注销或重新加载()。

1

我想你Searchin的的事情是:

Window.Location.reload();

用定时器每隔几秒就会触发一次,所以用户总是活跃起来。

(顺便说一句我有一个从Window close issues in gwt -ext

0

上覆盖整个区域的无形DIV安装一个JavaScript事件处理程序。如果它得到一个事件,发送一个AJAX请求到服务器。

服务器可以做任何需要做的事情。在客户端,您可以等待来自AJAX请求的回复并显示“您已注销”。

这种方法有一个缺点:存储在会话中的对象会长时间保持活动状态。因此,即使用户从未注销并离开(或他的浏览器崩溃),该会话仍会保持活动状态。

几天后,会有很多死机会累积起来,导致服务器崩溃。

因此,更好的解决方案是自动注销用户,因为您已经在上安装AJAX事件处理程序,以便在用户返回到浏览器时显示消息。

这样,您的服务器可以清理死亡会话,并且当用户可以读取它时(当他在屏幕前)时,用户会收到一条消息。

请注意,您不能区分用户和清洁团队敲击鼠标。