Esto es debido a que el gestor del cluster va a serializarla para repartirla entre los distintos nodos. Así, ante la caída de uno de ellos, el balanceador de carga puede redireccionar al usuario hacia otro nodo conservando todos los datos de sesión, por ejemplo el contexto de spring security.
Un objeto es serializable cuando:
- Implementa el interface java.io.serializable
- Todas sus propiedades también son serializables
Para comprobar si un objeto es serializable, lo mejor es intentar serializarlo. Si salta una excepción entonces es que tenemos algo mal.
A continuación se muestra un trozo de código que lee todos los objetos de sesión y los serializa a un fichero de texto. Para mayor seguridad, seguidamente intenta leerlos de ese fichero.
Si este código no da error, entonces la sesión es serializable y no habrá problemas con los cluster.
private void checkSession(HttpSession session) {
final String RUTA = "C:/MyDir/session.ser";
File f = new File(RUTA);
f.delete();
try {
FileOutputStream fileOut = new FileOutputStream(RUTA);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
String nombreAtributo;
@SuppressWarnings("rawtypes")
Enumeration enumNombres = session.getAttributeNames();
while (enumNombres.hasMoreElements()) {
nombreAtributo = (String) enumNombres.nextElement();
System.out.println("Serializando... " + nombreAtributo);
out.writeObject(session.getAttribute(nombreAtributo));
}
out.flush();
out.close();
fileOut.close();
System.out.printf("Todo ok");
} catch (IOException e) {
System.out.println("No serializable!!!!");
e.printStackTrace();
}
//****************************************//
FileInputStream fileIn = null;
ObjectInputStream in = null;
try {
fileIn = new FileInputStream(RUTA);
in = new ObjectInputStream(fileIn);
Object objeto;
while (true){
objeto = in.readObject();
System.out.println("Deserializando...." + objeto.getClass() + " -----> " + objeto);
}
}
catch (EOFException exc) {
try {
in.close();
fileIn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
catch (IOException i) {
i.printStackTrace();
}
catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
Este código se puede poner en cualquier parte de la aplicación que tenga acceso a la request. Por ejemplo, en Spring MVC se podría usar en un controller, un interceptor o incluso en un filtro.
No hay comentarios:
Publicar un comentario