Pregunta

Estoy usando GWT para mi aplicación del lado del cliente. Sin embargo, no estoy seguro de cómo me puedo manejar la gestión de sesiones. La aplicación GWT reside en una página, todas las llamadas de servidor se realizan a través de AJAX. Si una sesión expira en el servidor. vamos a suponer que el usuario no cierra el navegador, y el envío de alguna petición al servidor mediante RPC, ¿cómo es posible que mi servidor de notificar a la aplicación que la sesión ha expirado y que la parte del lado del cliente debe mostrar la pantalla de inicio de sesión de nuevo Mi código de ejemplo:

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

Si la sesión expira solamente tiene que mostrar la pantalla de inicio de sesión, si no quiere mostrar algún error usando window.alert ().

La forma de hacerlo y cuáles son todos los códigos necesarios en el lado del lado del servidor y el cliente?

¿Fue útil?

Solución

Usted podría tener el servidor de lanzar un AuthenticationException al cliente en caso de que el usuario ha cerrado la sesión.
Esto será atrapado en las devoluciones de llamada onFailure método, que puede entonces redirigir al usuario a la página de acceso.

Editar:
AuthenticationException no es una excepción estándar, por supuesto, sólo estaba haciendo un ejemplo. Puede ser que sea mejor quedarse con las excepciones estándar.

Para probar si detectó una excepción específica se puede utilizar el operador instanceof

    public void onFailure(Throwable e) {
                  if(e instanceof AuthenticationException) {
                        redirecttoLogin();
                  }
                  else {
                    showError(),
               }
            }

Otros consejos

Esto no se aplica directamente a los que utilizan RPC, pero para aquellos de ustedes que no están utilizando RPC, debe enviar un HTTP 401 del servidor. A continuación, se puede comprobar que el código de estado en su devolución de llamada RequestBuilder.

Cliente: Todas las devoluciones de llamada se extienden una devolución de llamada abstracta donde se implementa el 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
  }
}

Servidor: Todos los ServiceImplementations extender AbstractServicesImpl donde se tiene acceso a su SessionData. OnBeforeRequestDeserialized anular (String serializedRequest) y comprobar el SessionData allí. Si el SessionData tiene expirará a continuación, escribir un mensaje de error spacific al cliente. Este mensaje de error se está checkt en su AbstrCallback y redirigir a la página de entrada.

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();
    }
  }

}

Además también se puede anular doUnexpectedFailure (t Throwable) para evitar el registro de la NullPointerException tirado.

@Override
protected void doUnexpectedFailure(Throwable t) {
  if (this.sessionData != null) {
    super.doUnexpectedFailure(t);
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top