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

时间:2011-04-22 06:28:20

标签: java gwt gwt-rpc gwt-ext

大家好 我正在研究gwt-ext应用程序。在服务器端我正在使用Hibernate。 我在服务器端进行会话。超时是5分钟(在行动课上)。

现在进行一个用户登录的场景&保持打开五分钟。五分钟后,它会点击屏幕上的一个按钮。客户端有一些过程&它是2分钟,然后它去服务器调用。当它去服务器调用它已经是会话输出(因为会话时间是5分钟,已经过期)。并弹出会话输出的消息,重定向登录页面。

在整个案例中,用户认为我在系统上是活跃的(实际上在客户端5分钟后),所以为什么我被重定向到登录页面。

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

所以我想在客户端维护会话。如何在基于gwt的应用程序中实现这一点。 有没有其他方法可以解决这个问题。 谢谢大家。

4 个答案:

答案 0 :(得分:2)

一种方法是定期检查服务器,如果发生超时。您必须编写一个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()(特别是在登录后直接调用)。

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

答案 1 :(得分:1)

考虑用户点击屏幕上的按钮时的情况。您可以命中服务器并检查会话是否存活。

让我知道我是否已经了解情况。

答案 2 :(得分:1)

此代码将在超时时自动注销。对于我的代码,我希望在单击或按键时它应该注销。 案例如下:如果用户登录并且注销时间是5分钟。用户不会在屏幕上进行任何活动,因为根据上面的代码,它将在5分钟完成时自动注销。

现在我的要求是,如果用户登录并且5分钟内没有做任何事情。它不应该自动注销。而不是在完成5分钟后退出,如果用户点击或按下键在6分钟后,它应该进行注销过程。

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

答案 3 :(得分: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");
            }
        });