2011-04-22 77 views
1

你好全部 我正在gwt-ext应用程序上工作。在服务器端我使用Hibernate。 我在服务器端保持会话。它的超时时间是5分钟(在操作类中)。gwt应用程序客户端的会话管理

现在我们来看一个登录&的用户保持打开5分钟的时间。五分钟过期后,点击屏幕上的一个按钮。客户端有一些进程&它是2分钟之后,它将用于服务器调用。当它用于服务器调用时,它已经处于会话状态(因为会话时间是5分钟,已经过期)。并且会弹出一个会话消息,重定向登录页面。

在这种情况下,用户觉得我在系统上很活跃(实际上在客户端5分钟后),为什么我被重定向到登录页面。

背后的原因是会话在服务器端维护,服务器命中是在七分钟后。

所以我想在客户端也保留会话也如何在基于gwt的应用程序中实现这一点。 有没有其他办法可以解决这个问题。 感谢所有。

回答

2

一种方法是定期检查服务器是否发生超时。您将不得不编写一个servlet方法来执行该检查,而不会更新服务器会话超时!当然这会导致很多服务器命中。 (不一定是坏的方法虽然!)


但是,也许我会用一个dfifferent解决方案,它试图保持一个计时器在客户端与服务器的定时器,例如大约同步

客户端:

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

我假设你的服务器会话超时被更新的每一个客户端执行与服务器,例如交互时间一个GWT-RPC调用(如果该会话还没有超时)。

所以在客户端,然后,我会还更新客户端计时器,以保持它的大致同步:

myService.performSomeAction(...) { 

    @Override 
    public void onSuccess(String result) { 

      ClientTimers.renewSessionTimer(); 

      // remaining onSuccess handling 
    } 

    @Override 
    public void onFailure(Throwable caught) { 

      if (failedBecauseOfSessionTimeout()) { 

       // redirect to login 

      } else { 

       ClientTimers.renewSessionTimer(); 

       // remaining onFailure handling... 
      } 
    } 
} 

不要忘记尤其是直接调用后renewSessionTimer()上的所有交互(登录)。

重要说明:对于所有安全检查,仅使用服务器会话。客户端“会话计时器”仅为用户提供便利。不要根据该定时器或任何类型的客户端会话进行安全/授权检查。

1

考虑到用户点击屏幕上的按钮时的场景。你可以打一个服务器并检查会话是否存在。

让我知道,如果我得到的情况与否。

0

做得到的每一页事件我都没有这个....它工作正常。

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"); 
      } 
     }); 
1

该代码会在超时发生时自动注销。对于我的代码,我希望在点击或键入时它应该注销。 大小写如下:如果用户登录并且注销时间为5分钟。用户不按照上述代码在屏幕上执行任何活动,则会在完成5分钟后自动注销。

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

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