Buscar este blog

viernes, 9 de agosto de 2013

Comprobar si sesion serializable cluster / Check Session Serializable cluster

Cuando se trabaja con aplicaciones web que van a ejecutarse en varios nodos de un cluster, una de las cosas que hay que tener en cuenta es que todo objeto que se almacene en sesión debe ser serializable.

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:
  1. Implementa el interface java.io.serializable
  2. 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