#java #gwt #gwt-rpc #gwt-ext
#java #большой объем #gwt-rpc #gwt-ext #gwt
Вопрос:
Всем привет, я работаю над приложением gwt-ext.На стороне сервера я использую режим гибернации. Я поддерживаю сеанс на сервере side.it время ожидания составляет 5 минут (в классе действий).
Теперь возьмем secenario, в котором пользователь вошел в систему и остается открытым в течение пяти минут.По истечении пяти минут выполните щелчок по кнопке на экране.На стороне клиента происходит какой-то процесс, и он длится 2 минуты, и после этого он отправляется на вызов сервера.Когда он отправляется на вызов сервера, сеанс уже завершен (поскольку время сеанса составляет 5 минут, которое уже истекло).И появилось сообщение об окончании сеанса с перенаправлением страницы входа в систему.
Во всем этом случае пользователь чувствует, что я активен в системе (фактически, через 5 минут на стороне клиента), так почему же я перенаправлен на страницу входа в систему.
Причина в том, что этот сеанс поддерживается на стороне сервера.А попадание на сервер происходит через семь минут.
Поэтому я подумываю о том, чтобы сохранить сеанс и на стороне клиента.Как добиться этого в приложении на основе gwt. Есть ли какой-либо другой способ решить эту проблему. Спасибо всем.
Ответ №1:
Одним из методов было бы регулярно проверять сервер, если произошел тайм-аут. Вам пришлось бы написать метод сервлета, который выполняет эту проверку без возобновления тайм-аута сеанса сервера! И, конечно, это приведет к большому количеству обращений к серверу. (Хотя это не обязательно плохой метод!)
Но, возможно, я бы использовал другое решение, которое пытается поддерживать таймер на стороне клиента примерно синхронным с таймером сервера, например
На стороне клиента:
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() при всех взаимодействиях (особенно непосредственно после входа в систему).
Важное примечание: Для всех проверок безопасности используйте только сеанс сервера. Клиентский «таймер сеанса» — это просто удобство для пользователя. Не ставьте проверки безопасности / авторизации в зависимость от этого таймера или от любого вида клиентского сеанса.
Ответ №2:
Учитывая ваш сценарий, когда пользователь нажимает на кнопку на экране. Вы можете выполнить подключение к серверу и проверить, активен сеанс или нет.
дайте мне знать, понял ли я ситуацию или нет.
Ответ №3:
Этот код автоматически завершит выход из системы по истечении времени ожидания.Для моего кода я хочу, чтобы при нажатии или нажатии клавиши вниз он выполнял выход из системы. Случай такой: если пользователь вошел в систему, а время выхода составляет 5 минут.Пользователь не выполняет никаких действий на экране, кроме как прямо сейчас, согласно приведенному выше коду, он автоматически выйдет из системы по истечении 5 минут.
Теперь мое требование заключается в том, что если пользователь вошел в систему, и это ничего не делает в течение 5 минут.Он не должен автоматически выходить из системы.Вместо выхода из системы по истечении 5 минут, если пользователь нажимает или нажимает клавишу вниз в течение 6 минут, он должен выполнить процесс выхода из системы.
В основном процесс выхода из системы, когда таймер превышает указанное время, должен выполняться при активности пользователя, а не автоматически.
Ответ №4:
получаете ли вы событие каждой страницы, которое у меня есть, не this….it работает нормально.
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");
}
});