gwt中的会话管理

时间:2011-04-29 11:56:46

标签: java gwt gwt-ext

我正在开发一个GWT-ext应用程序。 在这个应用程序中,我管理客户端会话。为此我写下面的代码:

管理会话: 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);
    }
}

获取用户活动:

    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分钟后,它应该进行注销过程。

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

3 个答案:

答案 0 :(得分:2)

在Timer中,每秒增加一个变量。 当用户在5分钟或第6分钟后点击任何按钮而不是检查计数器变量,如果变量大于6,则可以使用 Window.Location.reload(); 来注销或重新加载()。

答案 1 :(得分:1)

我认为您要搜索的内容是:

Window.Location.reload();

使用计时器每隔几个secons点燃它,这样用户总是能够活跃起来。

(顺便说一下,我来自Window close issues in gwt -ext

答案 2 :(得分:0)

在覆盖整个区域的不可见div上安装JavaScript事件处理程序。如果它获得了一个事件,请向服务器发送一个AJAX请求。

然后,服务器可以执行任何需要执行的操作。在客户端,您可以等待AJAX​​请求的回复并显示“您已经注销”。

这种方法有一个缺点:存储在会话中的对象将保持活动太长时间。因此,即使用户从未退出并且只是走开(或者他的浏览器崩溃),该会话也将保持活跃状态​​。

几天后,会有很多死会话累积,导致服务器崩溃。

因此,更好的解决方案是自动注销用户,因为您已经安装了如上所述的AJAX事件处理程序,以便在用户返回浏览器时显示消息。

这样,您的服务器就可以清理死会话,当用户可以阅读时(当他在屏幕前时),用户会收到一条消息。

请注意,您无法区分用户和使用鼠标的清洁人员。