Управление сессиями в клиентской части приложения gwt - PullRequest
1 голос
/ 22 апреля 2011

Здравствуйте, все, что я работаю над приложением gwt-ext. На стороне сервера я использую Hibernate.У меня есть сеанс на стороне сервера. Время ожидания составляет 5 минут (в классе действия).

Теперь возьмем сценарий, в котором пользователь вошел в систему и остается открытым в течение пяти минут. Через пять минут истекает егонажмите на кнопку на экране. На стороне клиента есть какой-то процесс, и он занимает 2 минуты и после этого идет на серверный вызов. Когда он идет на серверный вызов, он уже завершен (так как время сеанса5 минут, которые уже истекли). И выскочило сообщение о сеансе с перенаправлением страницы входа.

В этом случае пользователь чувствует, что я активен в системе (после 5 минут на стороне клиента фактически) так почему я перенаправлен на страницу входа.

Причина в том, что этот сеанс поддерживается на стороне сервера. И попадание на сервер происходит через семь минут.

Так что я думаю, что maitainСессия на стороне клиента также. Как добиться этого в приложении на основе gwt.Есть ли другой способ решить эту проблему.Спасибо всем.

Ответы [ 4 ]

2 голосов
/ 22 апреля 2011

Одним из методов будет регулярная проверка сервера, если произошел тайм-аут.Вам нужно написать метод сервлета, который выполняет эту проверку без продления тайм-аута сеанса сервера!И, конечно, это приведет к большому количеству попаданий на сервер.(Хотя не обязательно плохой метод!)


Но, возможно, я бы использовал решение 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 () для всехвзаимодействия (особенно непосредственно после входа в систему).

Важное примечание: Для всех проверок безопасности используйте только сеанс сервера.Клиентский «таймер сессии» - это просто удобство для пользователя.Не делайте проверки безопасности / авторизации зависимыми от этого таймера или любого другого сеанса клиента.

1 голос
/ 29 апреля 2011

Этот код будет автоматически выходить из системы по мере истечения времени ожидания. Для моего кода я хочу, чтобы при нажатии или нажатии клавиши он выполнял выход из системы.Случай таков: если пользователь вошел в систему и время выхода из системы составляет 5 минут. Пользователь не выполняет никаких действий на экране, чем сейчас, согласно приведенному выше коду, он автоматически выйдет из системы по истечении 5 минут.

Теперь мое требование состоит в том, чтобы, если пользователь вошел в систему, и он ничего не делал в течение 5 минут. Он не должен делать никаких выходов из системы автоматически. Вместо выхода из системы по завершении 5 минут, если пользователь нажимает или нажимает клавишу вниззатем через 6 минут он должен выполнить процесс выхода из системы.

По сути, процесс выхода из системы, когда таймер превышает указанное время, должен выполняться для пользовательской активности, а не автоматически.

1 голос
/ 22 апреля 2011

Учитывая ваш сценарий, когда пользователь нажимает кнопку на экране. Вы можете запустить сервер и проверить, является ли сеанс живым или нет.

дайте мне знать, если у меня есть ситуация или нет.

0 голосов
/ 23 апреля 2011

получаю событие каждой страницы, которое у меня есть, это ... оно работает нормально.

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