0

我正在开发一个 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 分钟内单击或按下键那么它应该执行注销过程。

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

4

3 回答 3

2

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

于 2011-04-29T12:04:52.000 回答
1

我认为您正在搜索的内容是:

Window.Location.reload();

每隔几秒使用计时器触发一次,因此用户始终保持活跃。

(顺便说一句,我从gwt -ext 中的窗口关闭问题中得到了这个)

于 2011-04-29T12:01:40.187 回答
0

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

然后服务器可以做它需要做的任何事情。在客户端,您可以等待 AJAX 请求的回复并显示“您已注销”。

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

几天后,会积累如此多的死会话,以至于您的服务器将崩溃。

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

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

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

于 2011-04-29T12:03:01.663 回答