Управление сеансами на стороне клиента приложения gwt

#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");
            }
        });