GWT中会话超时的鼠标移动

时间:2012-06-22 13:36:50

标签: java gwt mouseevent

我正在研究GWT。在我的应用程序中,我想在没有执行任何操作(包括鼠标事件)的情况下在2分钟后添加会话时间。

我写了一个用过GWT会话对象的类。

public static boolean ValidSession(HttpSession session) {

        boolean aResult = true;

        logger.debug("Start of ValidSession");
        try
        {
            if(session!=null )
            {
                String strUserInf="";
                strUserInf=(String)session.getAttribute("userInf");
                logger.debug("User Inf in session is: " + strUserInf);
                if(strUserInf==null || strUserInf.trim().equals(""))
                {
                    logger.debug("User Info blank");
                    aResult =false;
                }

            }
            else
            {
                logger.debug("SessionNull");
                aResult=false;
            }
        }
        catch (Exception e) 
        {
            logger.error("Exception in ValidSession: ", e);
            aResult = false;                        
        }
        logger.debug("End of isSessionValid");
        return aResult;
    }

    public static void TimeUpdate(HttpSession session){
        session.setAttribute("lastAccessed", String.valueOf(session.getLastAccessed()));
        System.out.println("lastAccessed "+ session.getAttribute("lastAccessed"));
       }

但它仅在RPC调用时重置计时器。我也想检测鼠标移动。

有人可以提出解决方案吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

您可以在模块加载时执行类似的代码。

创建一个每2分钟运行一次的计时器并设置会话到期时间:

    private static Timer SESSION_TIMER = new Timer() {
            public void run() {
                SessionFactory.putValue(SesisonKey.SESSION_EXPIRED,
                        true);
            }
        };

使用此方法调用此方法重新启动计时器会话,如下所示:

    public static void renewTimer() {
            if (CLIENT_SIDE_TIMER != null) {
                CLIENT_SIDE_TIMER.cancel();
                SessionFactory.getClientInstance().put(
                        SesisonKey.SESSION_EXPIRED, false);
                //CLIENT_SIDE_TIMER.schedule(250 * 60 * 20);
                //1 Minute = 60000 Milliseconds
                CLIENT_SIDE_TIMER.schedule(60000 * 2);
            }
        }

NativePreviewHandler处理程序捕获鼠标事件并检查该会话是否已过期。

 final NativePreviewHandler nativeHandler = new NativePreviewHandler() {
                    @Override
                    public void onPreviewNativeEvent(NativePreviewEvent event) {

                    preventBack();

                        if (SessionFactory
                                .getValue(SesisonKey.CLIENT_SESSION_EXPIRED) != null) {
                            boolean expire = (Boolean) SessionFactory
                                    .getValue(SesisonKey.CLIENT_SESSION_EXPIRED);
                            if (expire) {
                                boolean show= false;
                                //logout session code
                                ClientSideTimers.renewSessionTimer();
                            }
                        }
                    }
                };
                Event.addNativePreviewHandler(nativeHandler);

如果您的屏幕稳定2分钟而不是它将通过计时器使会话变量值失效,如果值为false,则执行注销。

SESSION_EXPIRED是会话过期检查的常量变量,而不是SessionFactory是我的自定义工厂代码。你只是忽略我用过的varibles我的项目模式。你必须只设置一个不超过它的常量。如果还有任何查询,请告诉我。