gwt中的会话管理

我正在研究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分钟内点击或按下键然后它应该进行注销过程。

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

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

我认为你要搜索的是:

Window.Location.reload();

使用计时器每隔几个secons消防它,因此用户总是能够活跃。

(顺便说一句,我从窗口关闭问题gwt -ext )

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

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

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

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

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

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

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