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

Posted

技术标签:

【中文标题】gwt 应用程序客户端的会话管理【英文标题】:Session management in the client side of gwt application 【发布时间】:2011-04-22 06:28:19 【问题描述】:

大家好 我正在开发 gwt-ext 应用程序。在服务器端,我使用的是 Hibernate。 我在服务器端维护会话。它的超时时间是 5 分钟(在行动课上)。

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

在整个情况下,用户觉得我在系统上处于活动状态(实际上是在客户端 5 分钟后),所以为什么我被重定向到登录页面。

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

考虑当用户单击屏幕上的按钮时的场景。您可以点击服务器并检查会话是否处于活动状态。

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

【讨论】:

【参考方案3】:

此代码将在超时发生时自动注销。对于我的代码,我希望在单击或按下时它应该注销。 案例是这样的:如果用户登录并且退出时间是 5 分钟。用户不要在屏幕上做任何活动,按照上面的代码,它会在 5 分钟完成后自动退出。

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

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

【讨论】:

【参考方案4】:

获取我拥有的每个页面事件......它工作正常。

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

【讨论】:

以上是关于gwt 应用程序客户端的会话管理的主要内容,如果未能解决你的问题,请参考以下文章

使用 RPC 进行 GWT-Session 管理

gwt中会话超时时触发方法调用

服务器端的 GWT 违规检查引发 SerializationException

客户端上的 GWT HTTP 会话可用性

GWT 将大量数据从服务器发送到客户端的最佳实践

来自客户端 java 端的 GWT 查询