Управление сессиями в gwt - PullRequest
10 голосов
/ 29 мая 2009

Я использую GWT для своего клиентского приложения. Однако я не уверен, как справиться с управлением сессиями. Приложение GWT находится на одной странице, все серверные вызовы осуществляются через AJAX. Если сеанс истекает на сервере. давайте предположим, что пользователь не закрывал браузер и отправлял какой-либо запрос на сервер с помощью RPC, как мой сервер мог уведомить приложение о том, что сеанс истек и что на стороне клиента снова должен отображаться экран входа? 1001 *

ContactDataServiceAsync contactDataService = GWT
                .create(ContactDataService.class);
        ((ServiceDefTarget) contactDataService).setServiceEntryPoint(GWT
                .getModuleBaseURL()
                + "contactDatas");

        contactDataService.getContact(2,
                new AsyncCallback<ContactData>() {
                    public void onFailure(Throwable caught) {
                                      //code to show error if problem in connection or redirect  to login page

                    }

                    public void onSuccess(ContactData result) {
                        displayContact(result);
                    }
                });

Если сеанс истекает, он должен показывать экран входа в систему, в противном случае он хочет показать какую-то ошибку, используя Window.alert ().

Как это сделать и какие все коды необходимы на стороне сервера и на стороне клиента?

Ответы [ 3 ]

6 голосов
/ 29 мая 2009

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

Edit:
Конечно, AuthenticationException не является стандартным исключением, я просто делал пример. Возможно, лучше придерживаться стандартных исключений.

Чтобы попытаться поймать конкретное исключение, вы можете использовать оператор instanceof

    public void onFailure(Throwable e) {
                  if(e instanceof AuthenticationException) {
                        redirecttoLogin();
                  }
                  else {
                    showError(),
               }
            }
1 голос
/ 11 июня 2009

Это не относится напрямую к тем, кто использует RPC, но для тех из вас, кто не использует RPC, вы должны отправить HTTP 401 с сервера. Затем вы можете проверить этот код состояния в вашем обратном вызове RequestBuilder.

0 голосов
/ 15 января 2013

Клиент: Все обратные вызовы расширяют абстрактный обратный вызов, где вы реализуете onFailur ()

public abstract class AbstrCallback<T> implements AsyncCallback<T> {

  @Override
  public void onFailure(Throwable caught) {
    //SessionData Expired Redirect
    if (caught.getMessage().equals("500 " + YourConfig.ERROR_MESSAGE_NOT_LOGGED_IN)) {
      Window.Location.assign(ConfigStatic.LOGIN_PAGE);
    }
    // else{}: Other Error, if you want you could log it on the client
  }
}

Сервер: Все ваши ServiceImplementations расширяют AbstractServicesImpl, где у вас есть доступ к вашим SessionData. Переопределите onBeforeRequestDeserialized (String serializedRequest) и проверьте там данные SessionData. Если срок действия SessionData истек, напишите клиенту пространственное сообщение об ошибке. Это сообщение об ошибке получает чек в вашем AbstrCallback и перенаправляет на страницу входа.

public abstract class AbstractServicesImpl extends RemoteServiceServlet {

  protected ServerSessionData sessionData;

  @Override
  protected void onBeforeRequestDeserialized(String serializedRequest) {

    sessionData = getYourSessionDataHere()

    if (this.sessionData == null){ 
      // Write error to the client, just copy paste
      this.getThreadLocalResponse().reset();
      ServletContext servletContext = this.getServletContext();
      HttpServletResponse response = this.getThreadLocalResponse();
      try {
        response.setContentType("text/plain");
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        try {
          response.getOutputStream().write(
            ConfigStatic.ERROR_MESSAGE_NOT_LOGGED_IN.getBytes("UTF-8"));
          response.flushBuffer();
        } catch (IllegalStateException e) {
          // Handle the (unexpected) case where getWriter() was previously used
          response.getWriter().write(YourConfig.ERROR_MESSAGE_NOT_LOGGED_IN);
          response.flushBuffer();
        }
      } catch (IOException ex) {
        servletContext.log(
          "respondWithUnexpectedFailure failed while sending the previous failure to the client",
          ex);
      }
      //Throw Exception to stop the execution of the Servlet
      throw new NullPointerException();
    }
  }

}

Кроме того, вы также можете переопределить doUnexpectedFailure (Throwable t), чтобы избежать регистрации брошенного исключения NullPointerException.

@Override
protected void doUnexpectedFailure(Throwable t) {
  if (this.sessionData != null) {
    super.doUnexpectedFailure(t);
  }
}
...