gwt应用程序的客户端中的会话管理

大家好 我正在使用gwt-ext应用程序。在服务器端,我正在使用Hibernate。 我正在服务器端维护会话。超时时间为5分钟(在操作课中)。 现在以一个secenario为例,用户登录并保持打开状态五分钟。五分钟到期后,单击屏幕上的按钮。在客户端上有一些过程,这是2分钟,之后它用于服务器呼叫。当用于服务器呼叫时,它已经处于会话退出状态(因为会话时间为5分钟,这已经过期)。并且会话重定向的登录页面弹出了会话退出消息。 在这种情况下,用户会感觉我在系统上处于活动状态(实际上是在客户端5分钟后),因此为什么我被重定向到登录页面。 原因是该会话在服务器端维护,而服务器命中是在7分钟后。 因此,我正在考虑在客户端上保持会话。如何在基于gwt的应用程序中实现此目的。 还有其他方法可以解决此问题。 谢谢大家。     
已邀请:
一种方法是定期检查服务器,如果发生超时。您将必须编写一个Servlet方法来执行该检查,而无需更新服务器会话超时!当然,这将导致大量服务器故障。 (虽然不一定是坏方法!) 但是也许我会使用一种不同的解决方案,该解决方案试图使客户端的计时器与服务器的计时器保持大致同步,例如 客户端:
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()(尤其是在登录后立即调用)。 重要说明:对于所有安全性检查,请仅使用服务器会话。客户端“会话计时器”对于用户来说只是一个方便。不要根据该计时器或任何类型的客户端会话进行安全性/授权检查。     
考虑当用户单击屏幕上的按钮时的情况。您可以使服务器命中,并检查会话是否有效。 让我知道我是否知道情况。     
该代码会在超时时自动注销。对于我的代码,我希望单击或按下它即可注销。 情况如下:如果用户登录并且注销时间为5分钟。根据上面的代码,用户现在不执行任何屏幕操作,则系统将在5分钟后自动注销。 现在我的要求是,如果用户登录后5分钟未执行任何操作,则不应自动注销任何内容。而不是在5分钟完成后注销,如果用户在6分钟内单击或按下分钟,然后它应该执行注销过程。 基本上,由于计时器超过指定的时间而注销过程应该在用户活动上完成,而不是自动进行。     
确实得到了我所做的每一页事件。
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\");
            }
        });
    

要回复问题请先登录注册