sábado, 24 de mayo de 2014

Obtener el IP cliente con java en un esquema HA, con proxy o balanceador de carga

Eventualmente, se puede usar el comando servletRequest.getRemoteAddr() para recuperar la direccion IP del cliente que accede a nuestra aplicación java web de la siguiente manera:

 
   String ipAddress = request.getRemoteAddr();


Pero, si el usuario se conecta via un servidor proxy (ya sea de software o hardware) o en un esquema de alta disponibilidad considerando un balanceador de carga, el código original devolvera el ip del balanceador, router o proxy, no el ip del cliente original conectado.



Para resolver este problema, se debe recuperar la direccion IP del encabezado de la peticion HTTP mas conocida como “X-Forwarded-For (XFF)“ De la siguiente manera:

            
   //el cliente esta conectandose a traves de algun otro equipo?
   String ipAddress = request.getHeader("X-FORWARDED-FOR");  
   if (ipAddress == null) {  
    ipAddress = request.getRemoteAddr();  
   }


Hasta la próxima!

jueves, 22 de mayo de 2014

Configurar Jasper Reports 5 en JBoss EAP como módulo

En esta última semana tuve que resolver un problema de dependencia para poder usar el componente Jasper Reports 5 en el servidor JBoss EAP 6 instalado en Red Hat, en mi escenario ya estaba configurado el jasper como modulo sin embargo se usaba una versión anterior a la requerida por mi aplicación (específicamente la 3) lo cual desencadenaba errores al querer ejecutar los reportes del nuevo site. Por lo cual procedí a modificar la carpeta del módulo anterior ya configurado a fin de elevar la version del Jasper, primero se debe bajar el servicio del jboss con el comando en la terminal service jboss-as stop como root claro despues localize la carpeta del módulo del jasper en la siguiente ubicación /opt/jboss6/jboss-eap-6.0/modules/JasperReport3/main/


Copie todos los archivos jar necesarios en la carpeta main antes descrita a fin de que pueda levantar el Jasper Reports 5, la carpeta quedo con los siguientes archivos (dar click en la imagen para ampliar):


Luego de copiar los archivos antes descritos se debe modificar el archivo module.xml que es finalmente en el que se configuran las dependencias en los JAR del módulo, evidentemente antes en este archivo se encontraba direccionado el jar del Jasper Reports 3 y sus dependencias por lo cual solo tuve que actualizar este documento ahora referenciando a los nuevos componentes del Jasper Reports 5 copiados anteriormente.


Luego de modificar y guardar el archivo module.xml iniciamos nuevamente el servicio con el comando en la terminal service jboss-as start como root y ya podemos usar el Jasper Reports 5 en nuestro servidor.

Si desean bajar la carpeta main completa la dejo comprimida en el siguiente enlace del drive. Espero les sea de ayuda. Hasta la próxima!

lunes, 5 de mayo de 2014

Configurar pool de conexiones en JBoss EAP


El siguiente post es referido a configurar un pool de conexiones usando el servidor de aplicaciones JBoss y variables JNDI, primero indicar que este tipo de variables nos ayudan a recuperar configuraciones del mismo entorno del servidor lo que hace mas segura y configurable a nuestra aplicacion web, por ejemplo conexiones de base de datos, URL's de web services, conexiones LDAP, etc, etc.

Primero añadimos la variable JNDI de conexion (datasource) en el servidor en la pestaña profile y la opción Datasources damos click en add, llenar los campos según sea su motor de base de datos, en mi caso use oracle y quedo como se muestra la imagen (click en la img si se desea ampliar):



Una vez configurado el datasource procedemos a activarlo con el boton enable despues de seleccionarlo y testear la conexion en la pestaña Connection de la parte inferior del detalle de la configuración.



En la clase de nuestra aplicación que recupera la conexion debemos importar dos paquetes referidos al uso de variables JNDI que son javax.naming.Context y javax.naming.InitialContext luego podemos recuperar el datasource JNDI en nuestro codigo de la siguiente manera:
 
            
Connection cn = null;
try {
 Context ctx = new InitialContext();
 DataSource ds = (DataSource) ctx.lookup("java:jboss/ConfigSistemita");
 cn = ds.getConnection();

} catch (SQLException e) {
 System.out.println(e.toString());
 cn = null;
} catch (Exception e) {
 System.out.println(e.toString());
 cn = null;
}
return cn;


Hasta la próxima!