gestión de sesiones en GWT
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: / p>
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?
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);
}
}