Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java gwt应用程序客户端的会话管理_Java_Gwt_Gwt Rpc_Gwt Ext - Fatal编程技术网

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

Java gwt应用程序客户端的会话管理,java,gwt,gwt-rpc,gwt-ext,Java,Gwt,Gwt Rpc,Gwt Ext,大家好 我正在开发GWTEXT应用程序。在服务器端,我正在使用Hibernate。 我正在服务器端进行会话。超时时间为5分钟(在动作类中) 现在,以一个用户登录的secenario为例,它保持打开状态五分钟。五分钟后,它在屏幕上单击一个按钮。客户端有一些进程,需要两分钟,然后它进行服务器调用。当它进行服务器调用时,它已经是会话结束了(由于会话时间为5分钟,已经过期)。并且会弹出会话退出消息,并重定向登录页面 在整个案例中,用户感觉我在系统中处于活动状态(实际上在客户端5分钟后),所以我被重定向到

大家好 我正在开发GWTEXT应用程序。在服务器端,我正在使用Hibernate。 我正在服务器端进行会话。超时时间为5分钟(在动作类中)

现在,以一个用户登录的secenario为例,它保持打开状态五分钟。五分钟后,它在屏幕上单击一个按钮。客户端有一些进程,需要两分钟,然后它进行服务器调用。当它进行服务器调用时,它已经是会话结束了(由于会话时间为5分钟,已经过期)。并且会弹出会话退出消息,并重定向登录页面

在整个案例中,用户感觉我在系统中处于活动状态(实际上在客户端5分钟后),所以我被重定向到登录页面

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

因此,我也在考虑在客户端维护会话。如何在基于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()(尤其是在登录之后)


重要提示:对于所有安全检查,仅使用服务器会话。客户端“会话计时器”只是为了方便用户。不要依赖该计时器或任何类型的客户端会话进行安全/授权检查。

一种方法是,如果发生超时,则定期检查服务器。您必须编写一个servlet方法来执行该检查,而无需续订服务器会话超时!当然is将导致大量服务器点击。(但不一定是一个坏方法!)


但也许我会使用一种不同的解决方案,它试图使客户端的计时器与服务器的计时器大致同步,例如

客户端:

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()(尤其是在登录之后)


重要提示:对于所有安全检查,只使用服务器会话。客户端“会话计时器”只是为了方便用户。不要依赖于该计时器或任何类型的客户端会话进行安全/授权检查。

一定要获取我的每个页面事件,这样做……工作正常

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

一定要把我的每一个页面事件都记录下来……它工作得很好

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

当超时发生时,此代码将自动注销。对于我的代码,我希望在单击或按键时,它应该注销。 案例如下:如果用户登录,注销时间为5分钟。根据上述代码,用户现在不在屏幕上执行任何活动,5分钟后将自动注销

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


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

当超时发生时,此代码将自动注销。对于我的代码,我希望在单击或按下键时,它会自动注销。 案例如下:如果用户登录,注销时间为5分钟。根据上述代码,用户现在不在屏幕上执行任何活动,5分钟后将自动注销

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

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