2

我正在研究 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 调用时重置计时器。我也想检测鼠标移动。

任何人都可以提出解决方案吗?提前致谢。

4

1 回答 1

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,如果值为 false,则执行注销。

SESSION_EXPIRED 是会话过期检查的常量变量,而不是 SessionFactory 是我的自定义工厂代码。你只是忽略我的项目模式中使用的变量。你只需要设置一个常数就可以了。让我知道是否还有任何疑问。

于 2012-06-22T14:47:34.963 回答