Одним из методов будет регулярная проверка сервера, если произошел тайм-аут.Вам нужно написать метод сервлета, который выполняет эту проверку без продления тайм-аута сеанса сервера!И, конечно, это приведет к большому количеству попаданий на сервер.(Хотя не обязательно плохой метод!)
Но, возможно, я бы использовал решение dfifferent, которое пытается синхронизировать таймер на стороне клиента приблизительно с таймером сервера, например,
Клиентская сторона:
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 () для всехвзаимодействия (особенно непосредственно после входа в систему).
Важное примечание: Для всех проверок безопасности используйте только сеанс сервера.Клиентский «таймер сессии» - это просто удобство для пользователя.Не делайте проверки безопасности / авторизации зависимыми от этого таймера или любого другого сеанса клиента.