大家好 我正在研究gwt-ext应用程序。在服务器端我正在使用Hibernate。 我在服务器端进行会话。超时是5分钟(在行动课上)。
现在进行一个用户登录的场景&保持打开五分钟。五分钟后,它会点击屏幕上的一个按钮。客户端有一些过程&它是2分钟,然后它去服务器调用。当它去服务器调用它已经是会话输出(因为会话时间是5分钟,已经过期)。并弹出会话输出的消息,重定向登录页面。
在整个案例中,用户认为我在系统上是活跃的(实际上在客户端5分钟后),所以为什么我被重定向到登录页面。
背后的原因是该会话在服务器端维护。服务器命中是在七分钟之后。
所以我想在客户端维护会话。如何在基于gwt的应用程序中实现这一点。 有没有其他方法可以解决这个问题。 谢谢大家。
答案 0 :(得分:2)
一种方法是定期检查服务器,如果发生超时。您必须编写一个servlet方法来执行该检查,而无需更新服务器会话超时!当然,这将导致大量的服务器命中。 (虽然不一定是坏方法!)
但也许我会使用一种不同的解决方案,它试图让客户端的计时器与服务器的计时器大致同步,例如。
客户方:
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);
}
}
我假设每次客户端与服务器进行交互时,服务器会话超时都会更新,例如: GWT-RPC调用(如果会话尚未超时)。
所以在客户端,我还会更新客户端计时器,以保持大致同步:
myService.performSomeAction(...) {
@Override
public void onSuccess(String result) {
ClientTimers.renewSessionTimer();
// remaining onSuccess handling
}
@Override
public void onFailure(Throwable caught) {
if (failedBecauseOfSessionTimeout()) {
// redirect to login
} else {
ClientTimers.renewSessionTimer();
// remaining onFailure handling...
}
}
}
不要忘记在所有交互中调用renewSessionTimer()(特别是在登录后直接调用)。
重要说明:对于所有安全检查,仅使用服务器会话。客户端“会话计时器”只是用户的便利。不要根据该计时器或任何类型的客户端会话进行安全/授权检查。
答案 1 :(得分:1)
考虑用户点击屏幕上的按钮时的情况。您可以命中服务器并检查会话是否存活。
让我知道我是否已经了解情况。
答案 2 :(得分:1)
此代码将在超时时自动注销。对于我的代码,我希望在单击或按键时它应该注销。 案例如下:如果用户登录并且注销时间是5分钟。用户不会在屏幕上进行任何活动,因为根据上面的代码,它将在5分钟完成时自动注销。
现在我的要求是,如果用户登录并且5分钟内没有做任何事情。它不应该自动注销。而不是在完成5分钟后退出,如果用户点击或按下键在6分钟后,它应该进行注销过程。
基本上,当计时器超出指定时间的注销过程应该在用户活动上完成,而不是自动完成。
答案 3 :(得分:0)
确实得到了我已经不知道的每一页事件....它工作正常。
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");
}
});