You are on page 1of 97

Curso de JAVA AVANZADO

Facilitador: Ing. Luis Vargas L.

Curso de programacin distribuida en JAVA (versin 7, JDK 1.7.25)

Manual del alumno

Facilitador: Ing. Luis Vargas L.

INDICE

Contenido
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Introduccin al curso .......................................................................................................... 4 Introduccin ......................................................................................................................... 5 Enterprise java Beans...................................................................................................... 30 Java Persistence (API JPA) ............................................................................................ 32 Hibernate ........................................................................................................................... 34 Servlets, Java Server Pages .......................................................................................... 50 Java Server Faces............................................................................................................ 56 Web Services .................................................................................................................... 61 Rest Web Services ........................................................................................................... 66 Seguridad Java EE....................................................................................................... 71

Facilitador: Ing. Luis Vargas L.

1. Introduccin al curso
1.1 Objetivo de este curso En este curso vamos a ver como programar en la tecnologa Java, lo cual le permitir desarrollar y ejecutar aplicaciones Java en Arquitectura de N capas, que sean robustas y flexibles. 1.2 Manual del alumno Este manual del alumno es una ayuda para el alumno, para que tenga un recuerdo del curso. Este manual contiene un resumen de las materias que se van a estudiar durante el curso, pero el alumno debera de tomar notas personales para completar este manual. 1.3 Ejercicios prcticos Para captar mejor la teora, se harn muchos ejercicios con los alumnos, para probar la teora y verificar la integracin de la materia. Tambin, el alumno podr copiar sus cdigos en una memoria USB al fin del curso para llevarse, con el fin de seguir la prctica en su hogar.

Facilitador: Ing. Luis Vargas L.

2. Introduccin
Stack de tecnologas La importancia de tener un stack de tecnologa de base A la hora de hacer un sistema (web en Java) para una aplicacin empresarial, hay que tomar diversas decisiones -entre ellas de arquitectura-, las cuales no slo enmarcarn la forma de trabajar; sino que adems, harn ms fcil (o no) el desarrollo del sistema. Ello puede deberse a la facilidad de la tecnologa, al expertice del equipo de trabajo o bien, a la experiencia que se posea con ella. Otra cuestin relevante, es que dicha arquitectura tenga la capacidad de adaptarse a los requerimientos no funcionales de la solucin a construir. Es fundamental tener en consideracin toda la configuracin de los distintos componentes que definen el workbench, rea de trabajo, la cual si bien puede variar ligeramente, para distintas aplicaciones; contemplar, definitivamente, los siguientes aspectos:

rea de trabajo y L&F (Look & Feel). Seguridad (log-in, permisos, etc.). Administracin de usuarios, grupos y permisos. Auditora y logueo. Reporting. Mecanismos de notificacin (email, sms, chat). Mecanismo de persistencia y transaccionalidad.

Los componentes, anteriormente detallados, generalmente, son agnsticos al problema de negocio; y nuestros clientes, seguramente esperan que ellos estn all: funcionando, como un derecho adquirido que el mismo mercado ha ido transformando e imponiendo como caractersticas bsicas que ya no pueden no estar. El problema que a mi entender, persiste de forma recurrente, es que en las organizaciones no se invierte en tener una plantilla (tmplate) con dichos componentes pre-armados, lo que le permitira as, estar preparados para comenzar un desarrollo cunto antes. Por otro lado, funcionalidades que son comunes, a lo largo del tiempo en distintas aplicaciones como por ejemplo, loguearse en la aplicacin, manejo de usuarios, navegabilidad, etc.- son codificadas desde cero, una y otra vez, por distintas personas (o incluso por las mismas!); y por supuesto, con bugs que podran haberse corregido si se hubiese utilizado como punto de partida dicha plantilla que ya tiene sper probados estas funcionalidades.

Facilitador: Ing. Luis Vargas L.

Arquitectura Multicapas Cada capa compone un subsistema en el que se ubican clases con responsabilidades propias.

Instalacin de JDK, IDE Eclipse, Glassfish y MySQL o Instalacin de JDK Lo primero que debemos hacer es instalar el Java SE Development Kit o JDK desde el sitio http://www.oracle.com, damos clic sobre el producto a descargar segn la preferencia del sistema operativo que tengamos, como se muestra a continuacin:

Facilitador: Ing. Luis Vargas L.

Una vez instalado, definimos nuestras variables de entorno (path y classpath) para su ejecucin (propiedades del S.O.) o Instalacin IDE Eclipse Descargamos el IDE desde el sitio oficial http://www.eclipse.org, cuando hayan terminado de descargar el archivo vern que es un zip y no tiene un instalador. Esto se debe a que el programa no hace falta instalarlo, lo colocan donde deseen (les recomiendo "C:/eclipse" ) o Instalacin del Servidor Glassfish Lo descargamos del sitio oficial: http://glassfish.java.net , cuando hayan terminado de descargar el archivo vern que es un zip y no tiene un instalador. Esto se debe a que el programa no hace falta instalarlo, lo colocan donde deseen (les recomiendo "C:/glassfish" ) o Instalacin del MySQL Lo descargamos del sitio oficial: http://dev.mysql.com , seguimos las instrucciones presentadas en el instalador para culminar con la instalacin. Una vez instalado debemos de configurar nuestra BD siguiendo las instrucciones presentada.

Integracin Maven y Eclipse o Instalacin plugin Maven


Facilitador: Ing. Luis Vargas L. 7

a. Nos vamos al siguiente menu Help->Install New Software...

b. En la ventana que nos muestra vamos a Available Software Site y damos clic

Facilitador: Ing. Luis Vargas L.

c. Al hacer esto nos mostrara una ventana en la cual buscamos el boton Add... para agregar la URL del plugin

d. Cuando pulsemos Add... nos mostrara una ventana como la siguiente

e. En esta ventana debemos agregar el nombre de m2e updates y en Location agregamos la siguiente URL http://download.eclipse.org/technology/m2e/releases teniendo esto nos quedara de la siguiente manera:

Facilitador: Ing. Luis Vargas L.

Ahora clic en OK y luego nos mostrara que ya esta agregado, y luego de esto OK. nuevamente Luego en la ventana de instalacin desplegamos la lista de seleccin y buscamos m2e updates http://download.eclipse.org/technology/m2e/releases y lo seleccionamos. Nota: Aqui surge un pequeo inconveniente, cuando tratamos de buscar lo anteriormente mencionado puede que no lo muestre, para ello lo que hacemos es dar cancelar y luego Help-->Install New Software... y cuando procedamos a buscarlo ya aparecer.

Facilitador: Ing. Luis Vargas L.

10

f.

Seleccionamos

Maven Integration for Eclipse,

y luego

Next

>

Facilitador: Ing. Luis Vargas L.

11

g. Next >

h. Aceptamos la licencia y pulsamos Finish


Facilitador: Ing. Luis Vargas L. 12

i. Inicia descargando e instalando el plugin y el siguiente paso es reiniciar Eclipse:

Aqu se concluye con la instalacin solamente queda configurar el plugin m2e.

Facilitador: Ing. Luis Vargas L.

13

o Configuracin del plugin Maven a. Para seguir con la configuracin debemos ir a Window-->Preferences

Buscamos del lado izquierdo donde dice Maven, pulsamos sobre el, y seleccionamos lo siguiente:

Do not automatically update dependencies from remote repositories Download Artifact Sources Download Artifact JavaDoc Download repository index updates on startup

Facilitador: Ing. Luis Vargas L.

14

b. Luego de ello vamos a Maven-->User Interface y le colocamos el cheque a Open XML page in the POM editor by default

c. Ahora nos dirigimos a Maven-->Discovery y pulsamos en el botn Open Catalog. Luego de pulsar el botn Open Catalog nos abrira una venta en la cual debemos seleccionar m2e wtp : Maven Integration for WTP (Incubation)

Facilitador: Ing. Luis Vargas L.

15

d. Ya habiendo realizado lo anteriormente dicho nos mostrar una ventana de instalacin y pulsamos Next >

Facilitador: Ing. Luis Vargas L.

16

e. Next ->

f. Aceptamos la licencia y pulsamos Finish

g. Para finalizar nos pedir que reiniciemos Eclipse

Facilitador: Ing. Luis Vargas L.

17

creacin de un proyecto web de Maven con Eclipse Debemos ir a File-->New-->Other...

Buscamos la carpeta Maven y selccionamos Maven Project. Lo siguiente dar clic en el botn Next >

Next >
Facilitador: Ing. Luis Vargas L. 18

Buscamos en la columna de Artifact Id el que tenga el nombre de mavenarchetype-webapp, cuando nos muestra la ventana por defecto esta seleccionado maven-archetype-quickstart, entonces solo bajamos 3 posiciones y encontraremos la arquitectura para una aplicacin web.

En esta parte es definir datos del proyecto


Group Id: En este caso coloque com.webapp, puedes colocar como gustes, si quieres, com.app.do, o web.app etc. Artifact Id: Aqui deber ir el nombre de la aplicacin.
Facilitador: Ing. Luis Vargas L. 19

Lo siguiente es dar clic en Finish

Puede que se tarde un poco en crear el proyecto ya que comienza a descargar paquetes y a crear la arquitectura, luego de ello nos mostrara el proyecto creado, pero tendra un icono de warning.

Para arreglar esto debemos hacer unas configuraciones. Para ello damos clic derecho sobre el proyecto y nos vamos a Properties (Propiedades en espaol).

Facilitador: Ing. Luis Vargas L.

20

Clic en Project Facets el cual se encuentra en el lado izquierdo de la ventana.

Cambiamos la versin de Java que se tenia ya que por defecto la coloca en la 1.5, en mi caso estoy usando la 1.7 y por lo tanto coloque que trabajaria con la 1.7. Luego en la parte donde dice Dynamic Web Module, quitamos la seleccin y asi dejandola por el momento vaca y en lugar de tener la versin 2.3 la cambiamos a la version 3.0, aunque no lo coloque en esta imagen en la siguiente se ver. Luego procedemos a darle Apply (Aplicar)

Facilitador: Ing. Luis Vargas L.

21

Al haber realizado lo anterior procedemos a seleccionar la casilla de Dynamic Web Module en la version 3.0, esto es para que nos genere bien la parte del target y la creacin de una carpeta WebContent (aunque luego la tendremos que eliminar). Siguiente paso es pulsar OK

Ya teniendo esto, vamos a nuestro proyecto y buscamos la carpeta WebContent y la eliminaremos.

Facilitador: Ing. Luis Vargas L.

22

Siguiente paso nuevamente clic derecho a nuestro proyecto y a Propiedades. Y buscamos la parte del lado izquierdo que dice Deployment Assembly. En la parte central en la columna Source seleccionamos el campo /WebContent y lo eliminamos con el botn Remove que aparece del lado derecho.

Siguiente es agregar un nuevo directorio, para ello pulsamos el botn Add... y nos mostrar la siguiente ventana, en la cual seleccionamos Folder y luego Next >

Facilitador: Ing. Luis Vargas L.

23

Seleccionamos la direccin webapp, que se desglosa de la siguiente manera src/main/webapp. Lo siguiente es pulsar Finish

Facilitador: Ing. Luis Vargas L.

24

Realizada la parte anterior, en la parte izquierda buscamos la opcin Java Build Path (esta debajo de Deployment Assembly). Y en la parte central hay una pestaa llamada Libraries en esta parte debemos eliminar dos librerias la EAR Libraries y la Web App Libraries.

El siguiente paso es ir a la pestraa Order and Export y en esta parte seleccionamos todo y luego pulsamos OK.

Facilitador: Ing. Luis Vargas L.

25

Aquie vemos como queda el proyecto creado con Maven y sin el problema de warning.

Ya para finalizar, ejecutaremos el proyecto, para ello primero con Maven daremos un clean, para ello damos clic derecho en el proyecto luego Run As-> Maven clean

Facilitador: Ing. Luis Vargas L.

26

Luego un Maven Install para crear el war, para ello clic derecho en el proyecto Run As--> Maven install

Ahora nos toca ejecutar la aplicacin, para ello nuevamente clic derecho en el proyecto Run As--> Run on Server

Al tratar de correrlo en un Servidor nos desplegara una lista de servidores luego de ello buscamos el servidor que deseamos en mi caso tengo instalado un Tomcat v7, por lo tanto este es el que seleccione. Luego pulsamos Next >
Facilitador: Ing. Luis Vargas L. 27

Aca si tenemos un tomcat instalado unicamente colocamos la direccin de donde se encuentra en mi caso esta en /usr/share/apache-tomcat-7.0.32. En el campo del JRE, seleccionamos el que tenemos, en mi caso el JDK 1.7. Lo siguiente es dar clic en el botn Finish y si te mata la curiosidad :D da clic en siguiente Next >

Facilitador: Ing. Luis Vargas L.

28

Al finalizar mostrar la pagina de inicio es decir index.jsp.

Facilitador: Ing. Luis Vargas L.

29

3. Enterprise java Beans


Introduccin EJB (Enterprise JavaBeans) es un modelo de programacin que nos permite construir aplicaciones Java mediante objetos ligeros (como POJO's). Cuando construimos una aplicacin, son muchas las responsabilidades que se deben tener en cuenta, como la seguridad, transaccionalidad, concurrencia, etc. El estandar EJB nos permite centrarnos en el cdigo de la lgica de negocio del problema que deseamos solucionar y deja el resto de responsabilidades al contenedor de aplicaciones donde se ejecutar la aplicacin.

Configuracin y tipos de EJB a. Message-Driven EJBs (EJBs dirigidos por mensajes) Permiten el procesamiento de mensajes (operaciones) de forma asncrona (recepcion y tratamiento de eventos JMS) Actan como listeners (escuchadores) de eventos JMS (Java Message Service) Implementan el interfaz MessageListener Se "suscriben" a una cola (queue) quedando a la espera y se activan cuando se recibe un mensaje dirigido a dicha cola o Esos mensajes JMS pueden ser enviados por cualquier componente de una aplicacin Java EE (clientes, componentes Web, otros EJBs) o Los "clientes" de un Message-Driven EJB no invocan directamente sus mtodos, simplemente envan mensajes JMS b. Session EJBs (EJBs de sesin) Representan procesos de negocio (funcionalidades de la aplicacin) implementan un interfaz de negocio (bussines interface) Gestionan la interaccin con los "clientes" (objetos/procesos que hacen uso del componente) y encapsulan el flujo y manipulacin de la informacin en el servidor Proporcionan a los "clientes" una "fachada" de los servicios proporcionados
Facilitador: Ing. Luis Vargas L. 30

por otros componentes disponibles en el servidor (patrn de diseo Facade) Ofrecen operaciones sncronas (peticion-respuesta) o Procesos de negocio ejecutados en respuesta a una solicitud del cliente Contenedor de EJBs crea e inicializa sus instancias (inyectndoles las referencias necesarias) y las asigna a los "clientes" a medida que estos lo van requiriendo. En un instante de tiempo dado, slo un "cliente" tiene acceso a los mtodos de la instancia del EJB (control de concurrencia). o Contenedor de EJBs garantiza que cada mtodo del EJB se ejecuta dentro de una transaccin atmica Inyeccin de Dependencia en Java EE Uso de la anotacin @EJB acompaando al atributo donde se mantendr la referencia al EJB. o El tipo del atributo/referencia sera el nombre del interfaz de negocio que se desea invocar o El contenedor usar el nombre por defecto del EJB (o el que se especique en el parmetro @EBJ(mappedName="...")) para consultar al servidor de nombres JNDI, inyectando en ese atributo la referencia encontrada

Empaquetamiento y Contenedores Empresariales Como cualquier componente empresarial, los EJB tambin empaquetarse para ser desplegados en un servidor Java EE. deben

Facilitador: Ing. Luis Vargas L.

31

4. Java Persistence (API JPA)


Introduccin Java Persistence API (JPA) proporciona un estndar para gestionar datos relacionales en aplicaciones Java SE o Java EE, de forma que adems se simplifique el desarrollo de la persistencia de datos. Pero para entender JPA, tendremos que tener claro el concepto "persistencia". La persistencia o el almacenamiento permanente, es una de las necesidades bsicas de cualquier sistema de informacin de cualquier tipo. En primer lugar, se propuso que el programa tratara los datos haciendo consultas directas a la base de datos. Despus, se propuso trabajar con objetos, pero las bases de datos tradicionales no admiten esta opcin. Debido a esta situacin, aparecieron los motores de persistencia, cuya funcin es traducir entre los dos formatos de datos: de registros a objetos y de objetos a registros. Persistir objetos Java en una base de datos relacional implica serializar un rbol de objetos Java en una base de datos de estructura tabular y viceversa. Esencial es la necesidad de mapear objetos Java para optimizar velocidad y eficiencia de la base de datos En Java solucionamos problemas de negocio a travs de objetos, los cuales tienen estado y comportamiento. Sin embargo, las bases de datos relacionales almacenan la informacin mediante tablas, filas, y columnas, de manera que
Facilitador: Ing. Luis Vargas L. 32

para almacenar un objeto hay que realizar una correlacin entre el sistema orientado a objetos de Java y el sistema relacional de nuestra base de datos. JPA (Java Persistence API - API de Persistencia en Java) es una abstraccin sobre JDBC que nos permite realizar dicha correlacin de forma sencilla, realizando por nosotros toda la conversin entre nuestros objetos y las tablas de una base de datos. Esta conversin se llama ORM (Object Relational Mapping - Mapeo Relacional de Objetos), y puede configurarse a travs de metadatos (mediante xml o anotaciones). Por supuesto, JPA tambin nos permite seguir el sentido inverso, creando objetos a partir de las tablas de una base de datos, y tambin de forma transparente. A estos objetos se le conoce como entidades (entities). JPA establece una interface comn que es implementada por un proveedor de persistencia de nuestra eleccin (como Hibernate, Eclipse, etc), de manera que podemos elegir en cualquier momento el proveedor que ms se adecue a nuestras necesidades. As, es el proveedor quin realiza el trabajo, pero siempre funcionando bajo la API de JPA. Interfaces JPA Los 4 tipos de interfaces de las que se compone JPA son: javax.persistence.Persistence: Contiene mtodos estticos de ayuda para obtener una instancia de Entity Manager Factory de una forma independiente al vendedor de la implementacin de JPA. Una clase de inicializacin que va proporcionar un mtodo esttico para la creacin de una Entity Manager Factory. javax.persistence.EntityManagerFactory: La clase javax.persistence.Entity.Manager.Factory nos ayuda a crear objetos de EntityManager utilizando el patrn de diseo del Factory. Este objeto en tiempo de ejecucin representa una unidad de persistencia particular. Generalmente va a ser manejado como un singleton y proporciona mtodos para la creacin de instancias EntityManager. javax.persistence.EntityManagerFactory: La clase javax.persistence.Entity es una anotacin Java que se coloca a nivel de clases Java serializables y que cada objeto de una de estas clases anotadas representa un registro de una base de datos. javax.persistence.EntityManager: Es la interfaz principal de JPA utilizada para la persistencia de las aplicaciones. Cada Entity Manager puede realizar operaciones CRUD (Create, Read, Update, Delete) sobre un conjunto de objetos persistentes. Es un objeto nico, no compartido que representa una unidad de trabajo particular
Facilitador: Ing. Luis Vargas L. 33

para el acceso a datos. Proporciona mtodos para gestionar el ciclo de vida de las instancias entidad y para crear instancias Query. javax.persistence.Query: La interface javax.persistence.Query est implementada por cada vendedor de JPA para encontrar objetos persistentes manejando cierto criterio de bsqueda. JPA estandariza el soporte para consultas utilizando Java Persistence Query Language (JPQL) y Structured Query Language (SQL). Podemos obtener una instancia de Query desde una instancia de un Entity Manager. javax.persistence.EntityTransaction: Cada instancia de Entity Manager tiene una relacin de uno a uno con una instancia de javax.persistence.EntityTransaction, permite operaciones sobre datos persistentes de manera que agrupados formen una unidad de trabajo transaccional, en el que todo el grupo sincroniza su estado de persistencia en la base de datos o todos fallan en el intento, en caso de fallo, la base de datos quedar con su estado original. Maneja el concepto de todos o ninguno para mantener la integridad de los datos.

5. Hibernate
Es una herramienta de Mapeo objeto-relacional (ORM) para la plataforma Java que facilita el mapeo de atributos entre una base de datos relacional tradicional y el modelo de objetos de una aplicacin, mediante archivos declarativos (XML) o anotaciones en los beans de las entidades que permiten establecer estas relaciones. Para instalar las Hibernate Tools basta con ir a la pgina de descargas: http://www.hibernate.org/6.html y pinchar sobre el enlace Download de Hibernate Tools Una vez descargado basta con descomprimirlo en el directorio del Eclipse (el mismo directorio donde se encuentra el ejecutable de Eclipse, por ejemplo, en Windows, eclipse.exe). Si ahora arrancamos el Eclipse podemos comprobar, por ejemplo, que tenemos nuevas opciones en el asistente de creacin (File -> New -> Other...)

Facilitador: Ing. Luis Vargas L.

34

Creacin de la configuracin de Hibernate Las Hibernate Tools nos proporcionan un asistente para crear el fichero de configuracin de Hibernate (normalmente hibernate.cfg.xml). En este fichero es donde describiremos como se debe conectar Hibernate a la base de datos, cuales son los ficheros xml que describen los mapeos entre las clases y las tablas de la base de datos, ... Para crearlo haremos: File -> New -> Other... -> Hibernate -> Hibernate Configuration File (cfg.xml)

Facilitador: Ing. Luis Vargas L.

35

Le damos el nombre al fichero de configuracin (normalmente hibernate.cfg.xml), e indicamos donde debe guardarlo. Deber ser un directorio que en ejecucin forme parte del classpath, para que la aplicacin lo pueda localizar (si usamos Maven ser el directorio src/main/resources).

Facilitador: Ing. Luis Vargas L.

36

Ahora indicamos el dialecto que debe usar Hibernate. El dialecto, bsicamente, es el idioma que ha de hablar Hibernate con nuestra base de datos. Tambin indicamos la clase del driver de acceso a la base de datos, la URL de conexin, el usuario y la password, ... y en definitiva toda la informacin para que Hibernate se pueda concatenar correctamente a nuestra base de datos.

Facilitador: Ing. Luis Vargas L.

37

Cuando demos a Finish se crear el fichero, que tendr un aspecto similar (segn los datos introducidos en la pantalla anterior) a: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</p roperty> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/AUTE NTIA</property> <property name="hibernate.connection.username">autentia</property> <property name="hibernate.connection.password">autentia</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialec t</property> </session-factory> </hibernate-configuration>
Facilitador: Ing. Luis Vargas L. 38

Hibernate Console Ahora vamos a crear la consola de Hibernate. La consola es el eje central de las Hibernate Tools, ya que cualquier otra operacin que queramos hacer (generar cdigo, lanzar sentencias HQL, ...) dependern de la configuracin de la consola. Para crear una nueva configuracin de la consola de Hibernate hacemos: File > New -> Other... -> Hibernate -> Hibernate Console

Indicamos el nombre que le damos a esta configuracin, el proyecto asociado, y el fichero de configuracin donde est configurada nuestra conexin. Este fichero es el tpico fichero hibernate.cfg.xml de configuracin de Hibernate. Indicaremos el fichero de configuracin que hemos creado en el punto anterior:

Facilitador: Ing. Luis Vargas L.

39

Antes de pulsar el botn Finish, pincharemos sobre la pestaa Classpath. Aqu vamos a indicar donde se encuentra el driver de la base de datos. Esto es muy importante, ya que de lo contrario las Hibernate Tools sern incapaces de conectarse con la base de datos.

Ntese que tambin tenemos activado Include default classpath project. Esto es necesario para que las Hibernate Tools sean capaces de encontrar nuestros .class, por ejemplo para poder lanzar sentencias HQL. Ahora ya podemos pulsar el botn de Finish.
Facilitador: Ing. Luis Vargas L. 40

6. Generando cdigo a partir de la base de datos Ya estamos preparados para generar cdigo a partir de las tablas creadas en nuestra base de datos. Para ello pulsamos sobre el nuevo icono (apareci al instalar las Hibernate Tools) que tenemos en la barra de herramientas (en la imagen aparece enmarcado en un rectngulo rojo):

Al pulsar sobre el icono, deberemos seleccionar la opcin Hibernate Code Generation...... Nos aparece una ventana, donde en su lado izquierda aparece una zona en blanco. Sobre ella hay una barra de herramientas, pulsamos sobre el primer icono New launch configuration. Y ahora rellenamos los datos de la zona de la derecha:

Facilitador: Ing. Luis Vargas L.

41

Lo que hemos hecho sobre la pantalla anterior:


Le hemos puesto un nombre a esta nueva launch configuration. Hemos indicado el nombre de la configuracin de consola que se debe utilizar (la que hemos creado en el punto anterior). Hemos indicado el directorio de salida para el cdigo generado. Os recomiendo usar un directorio fuera de vuestro directorio de fuentes, para que no perdamos cdigo por error (sobreescribamos algn fichero). Hemos marcado la casilla Reverse engineer from JDBC Connection. Esto es para generar las clases a partir de la informacin que tenemos en la base de datos. Ojo, si queremos que genera las relaciones entre las clases es imprescindible que la base de datos est configurada con integridad referencial. Otro ojo, porque si usamos MySql las tablas deben estar creadas con InnoDB, si estn creadas como MySam la informacin de integridad referencial entre las tablas no se tiene en cuenta. Y en general marcamos los check que nos interesan.

Ahora pasamos a la pestaa de Exporters. Cada exporter es capaz de generar algo diferente (clases java, ficheros de configuracin, documentacin, ...). Marcaremos los que nos interesen. En la imagen de ejemplo se puede ver que hemos marcado Domain code (java) para generar los POJOs e Hibernate XML Mappings (.hbm.xml) para generar los ficheros de configuracin xml donde se describe el mapeo entre las clases y las tablas de la base de datos.

Facilitador: Ing. Luis Vargas L.

42

En esta misma pantalla de los Exportes tenemos otra dos opciones:


Use Java 5 syntax: el cdigo java generado usar la sintaxis List<Clase> para indicar el tipo de las colecciones. Generate EJB3 annotations: Genera POJOs anotados segn el estndar de EJB3. Esto es una alternativa a los ficheros xml de mapeo, de forma que, mediantes estas anotaciones, en el mismo POJO es donde se indica como se debe mapear con la base de datos. Estas anotaciones adems de evitarnos mantener esos xml, tienen la ventaja de que son compatibles con las anoraciones de la nueva especificacin 3 de EJBs (podramos convertir nuestros POJOs en EJBs de forma casi directa, o usar nuestros POJOs con la capa de persistencia de EJB3 en vez de con Hibernate).

Slo podemos usar estas opciones si tenemos una mquina virtual 5 o superior. Si es el caso, os lo recomiendo, la primera para detectar en compilacin posibles problemas de tipos, y el segundo sobre todo por escribir y mantener menos ficheros. Ahora ya podemos al botn Run para generar el cdigo.

7. revenge.xml el fichero de la venganza ;) Si observamos el cdigo generado en el punto anterior podemos ver dos cosas:

Facilitador: Ing. Luis Vargas L.

43

Si nuestros identificadores en la base de datos son numricos, los atributos correspondientes de los POJOs son tipos bsicos (short, int, long). Las relaciones de integridad referencial en la base de datos se han convertido en asociaciones bidireccionales en las clases (es decir, si tengo una relacin 1:n tendr una clase foo con un atributo que hace referencia a la clase bar, y en la clase bar tendr una lista de objetos de foo).

Estas dos situaciones no son siempre recomendables:

En el caso de los identificadores es recomendable que siempre sean atributos nulables, de esta forma Hibernate es capaz de distinguir si la entidad ya existe en la base de datos o si se trata de una nueva entidad que habr que aadir. En el caso de las relaciones, no siempre es necesaria esa bidirecccionalidad, de hecho, estas asociaciones bidireccionales son el caso menos frecuente, ya que solemos hacer la navegacin siempre en un sentido (por ejemplo de un pedido saco la lista de productos, pero de un producto no saco la lista de todos los pedidos donde aparece).

Para refinar este tipo de cosas podemos hacerlo a mano o usar el fichero revenge.xml. El uso de este fichero es recomendable ya que nos permite regenerar las clases sin perder los cambios. Para crear este fichero, sobre la primera pantalla que veamos al configurar el launch configuration vemos que hay un campo revenge.xml con un botn Setup.... Pulsamos este botn. Le decimos que queremos crear un nuevo fichero Create new....

Indicamos donde se debe guardar el fichero (debera ser un directorio que luego quede fuera de nuestra distribucin).

Facilitador: Ing. Luis Vargas L.

44

Ahora seleccionamos la configuracin de consola que creamos anteriormente y pulsamos sobre el botn Refresh. Con esto nos aparecer a la izquierda nuestro esquema de la base de datos con las tablas, esto nos permite seleccionar las tablas de las que queremos generar cdigo (por defecto lo que hicimos en el punto anterior genera cdigo para todas las tablas del esquema). Marcamos las que nos interesan y pulsamos sobre Include.... Veremos como pasan al lado de la derecha.

Facilitador: Ing. Luis Vargas L.

45

Pulsamos sobre Finish y volvemos a la pantalla de configuracin de launch configuration. Podemos ver como ya aparece el nombre del fichero que acabamos de crear.

Facilitador: Ing. Luis Vargas L.

46

Ahora podemos localizar el fichero en nuestro explorador de paquetes de Eclipse y abrirlo. Veremos que nos aparece un editor especfico, que nos permite, de forma ms menos visual, modificar este fichero.

En la pestaa Type Mappings podemos indicar como se deben mapear las tipos de la base de datos con los tipos de Java. Por ejemplo, en esta seccin podemos aadir un mapeo del tipo INTEGER de JDBC al tipo Java.lang.Integer de Java. Con esto solucionamos el tema de los identificadores numricos, consiguiendo que sean nulables.

Si queremos que las relaciones de la base de datos no se conviertan en asociaciones bidireccionales, tendremos que modificar a mano fuente del
Facilitador: Ing. Luis Vargas L. 47

fichero revenge.xml (lamentablemente las Hibernate Tools todava no soportan hacer esto de forma visual). Para ello podemos pinchar sobre la pestaa Source. Un ejemplo de fichero sera el siguiente: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-reverse-engineering PUBLIC "//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering3.0.dtd" > <hibernate-reverse-engineering> <type-mapping> <sql-type jdbc-type="INTEGER" hibernatetype="java.lang.Integer"></sql-type> </type-mapping> <table-filter match-catalog="AUTENTIA" match-name="BuyCart"/> <table-filter match-catalog="AUTENTIA" matchname="BuyCartProduct"/> <table-filter match-catalog="AUTENTIA" match-name="Category"/> <table-filter match-catalog="AUTENTIA" match-name="Product"/> <table name="Product"> <foreign-key constraint-name="fk_category_id"> <set exclude="true"/> </foreign-key> </table> <table name="BuyCartProduct"> <foreign-key constraint-name="fk_product_id"> <set exclude="true"/> </foreign-key> <foreign-key constraint-name="fk_buyCart_id"> <many-to-one exclude="true"/> </foreign-key> </table> </hibernate-reverse-engineering>

Vemos como tenemos los mapeos de los tipos de datos, las tablas que se tienen que usar al hacer la ingeniera inversa, y luego como se tienen que hacer las asociaciones. En el ejemplo hay una relacin 1:n entre la tabla Category y Product. De forma que por defecto se nos crear un atributo en la clase Product que apunta a la categora correspondiente, y en la clase Category tendremos una lista de todos los productos que tienen esa categora. Lo que estamos haciendo en el ejemplo es que esta asociacin sea unidireccional de forma que desde la
Facilitador: Ing. Luis Vargas L. 48

clase Product podremos acceder a su categora, pero desde la clase Category no podremos acceder a todos los productos. Ntese que fk_category_id es el nombre de la constraint que hay en el campo de la tabla Product donde se guarda la clave ajena de la tabla Category. Mostramos el script de creacin para aclarar este prrafo: CREATE TABLE Category ( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(45) NOT NULL, description VARCHAR(255) NULL, PRIMARY KEY(id) ) engine=innodb default charset=utf8 collate=utf8_spanish_ci; CREATE TABLE Product ( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, categoryId INTEGER UNSIGNED NOT NULL, name VARCHAR(45) NULL, description VARCHAR(255) NULL, price INTEGER UNSIGNED NOT NULL, PRIMARY KEY(id), constraint fk_category_id foreign key (categoryId) references Category (id) ) engine=innodb default charset=utf8 collate=utf8_spanish_ci;

Ahora, gracias al fichero revenge.xml podemos volver a generar las clases, pero esta vez el resultado obtenido se ajustar mucho ms a nuestras necesidades. El uso de Hibernate es muy recomendable para aislarnos de la base de datos y facilitarnos el acceso a la misma. Con herramientas como Hibernate Tools conseguimos facilitar mucho ms el trabajo.

Facilitador: Ing. Luis Vargas L.

49

6. Servlets, Java Server Pages


Los servlets y Java Server Pages (JSPs) son dos mtodos de creacin de pginas web dinmicas en servidor usando el lenguaje Java. En ese sentido son similares a otros mtodos o lenguajes tales como el PHP, los CGIs (common gateway interface), programas que generan pginas web en el servidor, o los ASP (Active Server Pages), un mtodo especfico de Microsoft. Sin embargo, se diferencian de ellos en otras cosas. Para empezar, los JSPs y servlets se ejecutan en una mquina virtual Java, lo cual permite que, en principio, se puedan usar en cualquier tipo de ordenador, siempre que exista una mquina virtual Java para l. Cada servlet (o JSP, a partir de ahora lo usaremos de forma indistinta) se ejecuta en su propia hebra, es decir, en su propio contexto; pero no se comienza a ejecutar cada vez que recibe una peticin, sino que persiste de una peticin a la siguiente, de forma que no se pierde tiempo en invocarlo (cargar programa + intrprete). Su persistencia le permite tambin hacer una serie de cosas de forma ms eficiente: conexin a bases de datos y manejo de sesiones, por ejemplo. Los JSPs son en realidad servlets: un JSP se compila a un programa en Java la primera vez que se invoca, y del programa en Java se crea una clase que se empieza a ejecutar en el servidor como un servlet. La principal diferencia entre los servlets y los JSPs es el enfoque de la programacin: un JSP es una pgina Web con etiquetas especiales y cdigo Java incrustado, mientras que un servlet es un programa que recibe peticiones y genera a partir de ellas una pgina web

Ambos necesitan un programa que los contenga, y sea el que enve efectivamente pginas web al servidor, y reciba las peticiones, las distribuya entre los servlets, y lleve a cabo todas las tareas de gestin propias de un servidor web. Integracin de Servlets y EJB - Inyeccin de recursos de Java EE en un Web Bean
Facilitador: Ing. Luis Vargas L. 50

- Llamando a Web Bean desde un Servlet - Llamada a un Web Bean desde un Message-Driven Bean - endpoints JMS - Empaquetamiento y despliegue.

Los Web Beans estn totalmente integrados en un entorno de Java EE. Los Web Beans tienen acceso a recursos de Java EE y a contextos persistentes de JPA. Se pueden ser utilizar en expresiones Unificadas EL en pginas JSF y JSP. Pueden ser inyectados en algunos objetos, tales como Servlets y Message Driven Beans, los cuales no son Web Beans. Inyeccin de recursos de Java EE en un Web Bean Todos los Web Beans sencillos y empresariales pueden aprovechar la inyeccin de dependencia de Java EE utilizando@Resource, @EJB y @PersistenceContext. Ya hemos visto algunos ejemplos de esto, aunque no prestamos mucha atencin en el momento. @Transactional @Interceptor public class TransactionInterceptor { @Resource Transaction transaction; @AroundInvoke public Object manageTransaction(InvocationContext ctx) { ... }

} @SessionScoped public class Login { @Current Credentials credentials; @PersistenceContext EntityManager userDatabase;

...
Facilitador: Ing. Luis Vargas L. 51

} Los @PostConstruct de Java EE y las llamadas de @PreDestroy tambin son compatibles con todos los Web Beans sencillos y empresariales. El mtodo @PostConstruct es llamado despus de realizar toda la inyeccin. Hay una restriccin para tener en cuenta aqu: @PersistenceContext(tipo=EXTENDIDO) no es compatible con Web Beans sencillos. Llamando a Web Bean desde un Servlet Es fcil utilizar un Web Bean desde un Servlet en Java EE 6. Simplemente inyecte el Web Bean mediante campo de Web Beans o Inyeccin de mtodo inicializador. public class Login extends HttpServlet { @Current Credentials credentials; @Current Login login; @Override public void service(HttpServletRequest request, HttpServletResponse respon se) throws ServletException, IOException { credentials.setUsername( request.getAttribute("username") ): credentials.setPassword( request.getAttribute("password") ): login.login(); if ( login.isLoggedIn() ) { response.sendRedirect("/home.jsp"); } else { response.sendRedirect("/loginError.jsp"); }
Facilitador: Ing. Luis Vargas L. 52

} El cliente proxy de Web Beans cuida las invocaciones del mtodo de enrutamiento desde el Servlet a las instancias correctas de Credenciales e Inicio de sesin para la peticin y sesin HTTP actuales. Llamada a un Web Bean desde un Message-Driven Bean La inyeccin de Web Beans se aplica a todos los EJB, incluso cuando no estn bajo el control del administrador de Web Bean (si fueron obtenidos por el JNDI o inyeccin utilizando @EJB, por ejemplo). En particular, se puede utilizar inyeccin de Web Beans en Message-Driven Beans que no sean considerados Web Beans porque no se puede inyectarlos. Se pueden incluso utilizar enlaces de interceptor de Web Beans para MessageDriven Beans. @Transactional @MessageDriven public class ProcessOrder implements MessageListener { @Current Inventory inventory; @PersistenceContext EntityManager em; public void onMessage(Message message) { ... }

} As, la recepcin de mensajes es superfcil en un entorno de Web Beans. No obstante, tenga en cuenta que no hay sesin o contexto de conversacin disponible cuando se enva un mensaje a un Message-Driven Bean. Slo los Web Beans @RequestScoped y @ApplicationScoped Web Beans estn disponibles. Tambin es fcil enviar mensajes mediante Web Beans.
Facilitador: Ing. Luis Vargas L. 53

endpoints JMS Enviar mensajes mediante JMS puede ser bastante complejo, debido al nmero de objetos diferentes que se tienen que manejar. Para colas tenemos Queue, QueueConnectionFactory, QueueConnection, QueueSession y QueueSender. Para temas tenemos Topic, TopicConnectionFactory, TopicConnection, TopicSession y TopicPublisher. Cada uno de estos objetos tiene su propio ciclo de vida y modelo de hilos de los cuales tenemos que preocuparnos. Los Web Beans se encargan de eso por nosotros. Todo lo que se necesita es reportar la cola o tpico en web-beans.xml, especificando un tipo de enlace y conexin de fbrica. <Queue> <destination >java:comp/env/jms/OrderQueue</destination> <connectionFactory >java:comp/env/jms/QueueConnectionFactory</connectionFactory> <myapp:OrderProcessor/> </Queue > <Topic> <destination >java:comp/env/jms/StockPrices</destination> <connectionFactory >java:comp/env/jms/TopicConnectionFactory</connectionFactory> <myapp:StockPrices/> </Topic >

Facilitador: Ing. Luis Vargas L.

54

Ahora podemos inyectar Queue, QueueConnection, QueueSession o QueueSender para una cola, o Topic, TopicConnection, TopicSession oTopicPublisher para un tema. @OrderProcessor QueueSender orderSender; @OrderProcessor QueueSession orderSession; public void sendMessage() { MapMessage msg = orderSession.createMapMessage(); ... orderSender.send(msg); } @StockPrices TopicPublisher pricePublisher; @StockPrices TopicSession priceSession; public void sendMessage(String price) { pricePublisher.send( priceSession.createTextMessage(price) ); } El ciclo de vida de objetos JMS inyectados es controlado por el administrador deWeb Bean. Empaquetamiento y despliegue. Web Beans no define ningn despliegue especial de archivo. Se puede empaquetar Web Beans en JAR, EJB-JAR o WAR cualquier ubicacin de despliegue en la aplicacin classpath. No obstante, cada archivo que contiene Web Beans debe incluir un archivo llamado web-beans.xml en META-INF o en el directorio WEB-INF. El archivo puede estar vaco. Los Web Beans desplegados en archivos que no tienen un archivo web-beans.xml no estarn disponibles para uso en la aplicacin. Para ejecucin Java SE, los Web Beans pueden ser desplegados en cualquier lugar en el que los EJB se puedan implementar para ejecucin por el contenedor Lite EJB incorporable. De nuevo, cada lugar debe contener un archivo web-beans.xml.

Facilitador: Ing. Luis Vargas L.

55

7. Java Server Faces


Introduccin Las empresas de hoy en da viven en un mundo global competitivo que necesitan aplicaciones para satisfacer las necesidades de negocio, que son cada vez ms complejas. Con el avance de las tecnologas web y la Internet, se han abierto nuevas oportunidades para los desarrolladores de aplicaciones empresariales; permitindoles el uso de las nuevas tecnologas web en el desarrollo de aplicaciones mucho ms robustas, escalables y con un mayor rendimiento. Algunas de las nuevas tecnologas que han surgido son: JavaServer Faces (JSF) que es la tecnologa estndar de la edicin empresarial de Java (Java Enterprise Edition, Java EE) para la creacin de interfaces de usuario en la web y que permite integrar otras tecnologas como las hojas de estilo en cascada (Cascade Style Sheet, CSS) que describen como se va a mostrar un documento, Ajax (Asynchronous JavaScript And XML); un modelo de desarrollo web para crear aplicaciones interactivas, JavaBeans empresariales (Enterprise JavaBeans, EJB) y el API (Application Programming Interface) de Java para el manejo de entidades persistentes (Java Persistence API, JPA) sobre bases de datos relacionales. La Figura 1.1 muestra el conjunto de tecnologas de Java EE que pueden utilizarse para el desarrollo de aplicaciones web. Todas estas tecnologas sern descritas en este documento.

Java Server Faces [3, 4] (JSF) es un estndar de Java hacia la construccin de interfaces de usuario para aplicaciones web que simplifican el desarrollo de aplicaciones web del lado del cliente, JSF est basado en la tecnologa Java EE. En el 2009 se dio a conocer la nueva versin JSF 2.0, que contiene algunas caractersticas y/o mejoras con respecto a las versiones anteriores (JSF 1.0, JSF 1.1 y JSF 1.2) como son: Mejoras en la navegacin: navegacin condicional, inspeccin en tiempo de ejecucin en las reglas de navegacin. Control de excepciones: permite fcilmente la creacin de una pgina de error que utiliza componentes JSF. Mejoras en la expresin del lenguaje: compatibilidad con mtodos arbitrarios incluyendo el paso de parmetros. Validacin: es una nueva especificacin java desarrollada para la validacin de
Facilitador: Ing. Luis Vargas L. 56

beans. Una pgina JSF utiliza la extensin *.xhtml, es decir, una combinacin de XML con HTML y puede incluir componentes como CSS, JavaScript, entre otros. La especificacin de JSF define seis fases distintas en su ciclo de vida: 1. Restauracin de la vista: Crea un rbol de componentes en el servidor para representar la informacin de un cliente. 2. Aplicar valores de la peticin: Actualiza los valores del servidor con datos del cliente. 3. Proceso de validacin: Valida los datos del usuario y hace la conversin. 4. Actualizacin de valores del modelo: Actualiza el modelo del servidor con nuevos datos. 5. Invocar la aplicacin: Ejecutar cualquier lgica de aplicacin para cumplir con la solicitud. 6. Procesar la respuesta: Guarda un estado y da una respuesta al cliente. Caractersticas de JSF o MVC: Implementa el patrn de diseo Modelo-Vista-Controlador o RAD: Desarrollo rpido de aplicaciones para Web. o Componentes de interfaz de usuario: ya cuenta desarrollados componentes reutilizables listos para utilizarse. o Render Kits: Los componentes pueden desplegarse no solamente en navegadores Web, sino en dispositivos mviles u otros tipos de clientes. o Extensibilidad: Es altamente extensible debido a su arquitectura. o Internacionalizacin: Las vistas pueden mostrarse en distintos idiomas. Nuevas caractersticas de JSF 2 o Manejo de condiciones por default ms inteligentes. o Manejo de anotaciones para varias configuraciones. o Soporte nativo para AJAX. o Soporte por default para Facelets. o Ms componentes y validadores. Ajax en JSF JSF2 estandariza Asynchronous JavaScript y XML (Ajax) funcionalidad a travs de bibliotecas de componentes JSF e introduce el f: tag ajax para proporcionar capacidades Ajax de una manera estndar. Ajax permite que las pginas de Internet para comunicarse de forma asncrona con el servidor web y puede mejorar significativamente la experiencia del usuario. El f: tag ajax aade capacidades Ajax para uno o ms componentes JSF.
Facilitador: Ing. Luis Vargas L. 57

Puede estar anidada dentro de un solo componente de interfaz de usuario para permitir Ajax para ese componente, o se puede envolver alrededor de mltiples componentes para permitir el Ajax para muchos componentes. El "ejecutar" y "render" atribuye especificar una lista delimitada por espacios de identificadores de los componentes que se deben incluidas en el envo de formularios y las actualizaciones de DOM para peticiones Ajax. Ejemplo: JSF Example 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml" 4 xmlns:f="http://java.sun.com/jsf/core" 5 xmlns:h="http://java.sun.com/jsf/html"> 6 <h:head /> 7 <body> 8 <h:form> 9 <h:commandButton value="Click"> 10 <f:ajax render="message" listener="#{ajaxBean.handleEvent}" /> 11 </h:commandButton> 12 <h:outputText id="message" value="#{ajaxBean.message}" /> 13</h:form> 14</body> 15</html> Java Code 1 package com.mycompany; 2 3 import javax.faces.bean.ManagedBean; 4 import javax.faces.bean.RequestScoped; 5 import javax.faces.event.AjaxBehaviorEvent; 6 7 @ManagedBean 8 @RequestScoped 9 public class AjaxBean { 10 11 private String message; 12 13 public String getMessage() { 14 return message; 15 } 16 17 public void handleEvent(AjaxBehaviorEvent event) {
Facilitador: Ing. Luis Vargas L. 58

18 message = "Hello World"; 19 } 20 21} Salida: Hello World

Integracin JSF - PrimeFaces AJAX - EJB y JPA. Java Server Faces es un estndar dentro de la pila JEE (Java Enterprise Edition) que permite el desarrollo de la capa de presentacin y control para aplicaciones Web. JSF permite el desarrollo de aplicaciones Web en base a componentes y eventos. Aproximacin tpica para el desarrollo de aplicaciones interactivas en entornos de escritorio. De esta manera abandona la aproximacin tradicional y ms limitada de "peticin/respuesta", en la que se trabaja bsicamente con documentos y apuesta por el trabajo con pantallas de interaccin. Gracias a los componentes de JSF y Facelets es mucho ms sencillo reutilizar piezas visuales (listas, controles, campos de entrada, ...) ya que estos se pueden "paquetizar" en forma de componentes por composicin, que resultarn muy fciles de usar en distintas partes de la aplicacin, cmo si se tratara de un componente estndar. Adems, la idea de gestin de la interaccin entre el usuario y la mquina en base a eventos, permite realizar interfaces de usuario mucho ms ricas desde el punto de vista de la usabilidad, y simplifica el desarrollo de las mismas. Acercndose cada vez ms las aplicaciones Web a las funcionalidades visuales tpicamente ofrecidas por las aplicaciones de escritorio. JSF se encuentra actualmente en su versin 2.x. Este nueva versin da soporte directamente a tecnologa AJAX (Asynchronous JavaScript and XML), lo que la hace an ms atractiva, ya que gracias a AJAX se pueden actualizar partes de la pgina sin necesidad de hacer una peticin completa al servidor. De esta forma se mejora el ancho de banda ya que por la red viajan menos datos, y se mejora la experiencia del usuario ya que se evitan incmodos parpadeos (al recargar la pgina completa) y se mejora la usabilidad haciendo las pginas ms dinmicas. Primefaces es una librera de componentes para JSF. Estos componentes aportan, frente a los componentes estndar de JSF, una abstraccin para el uso de la tecnologa AJAX ya soportada en JSF 2. Es decir, el desarrollador puede centrarse en la funcionalidad ofrecida sin tener que preocuparse del JavaScript que se ejecutar en el cliente o de que partes de la pantalla sern necesarias refrescar en respuesta de un evento en la interfaz de usuario.

Facilitador: Ing. Luis Vargas L.

59

No siendo Primefaces parte del estndar JEE, ahora es la nica librera de componentes visuales que podemos decir que soporta de manera estable la versin 2 de JSF. JPA (Java Persisence API) es un estndar de Java (JSR-220) que permite a los desarrolladores trabajar de forma sencilla con bases de datos relacionales. JPA permite la abstraccin de la fuente de datos, permitiendo que el cdigo sea portable entre distintos sistemas gestores de bases de datos: Oracle, DB2, MySQL, PostgresSQL, ... Gracias a JPA el desarrollador se puede centrar en la lgica de negocio, olvidando los detalles de implementacin la capa de acceso a datos. Esto permite realizar desarrollos ms rpidos y ms seguros. Hibernate es un estndar de facto ampliamente aceptado y extendido en el mercado. Tanto que la implementacin de referencia de JPA es el EntityManager de Hibernate. En la medida de lo posible, tratamos de trabajar con la especificacin, de modo que la implementacin que usemos por entorno o servidor de aplicaciones debera ser trasparente. Una aplicacin basada en JPA, an usando Hibernate, sin salirse del estndar podra hacerse correr bajo el soporte de OpenJPA, por ejemplo. No obstante lo anterior, si el proyecto lo requiere, podemos hacer uso de ciertas facilidades de Hibernate que no forman parte del estndar, pero imprimen una riqueza del lado de la capa de persistencia como el soporte para una cach de segundo nivel o la integracin con un motor de indexacin y recuperacin de contenidos textuales como es Apache Lucene. Subversion es un repositorio de cdigo. Este tipo de servicios nos permiten guardar nuestro cdigo y poder ver el histrico de cambios, hacer etiquetas (versiones) sobre un punto determinado, abrir nuevas ramas de desarrollo, ... A da de hoy no se concibe un desarrollo sin usar este tipo de herramientas, ya que facilitan la colaboracin entre desarrolladores (mientras ms grande sea el equipo ms se justifica la herramienta), sirve como backup (al igual que una base de datos, todo el cdigo se almacena en un punto central, adems de en las mquinas de cada desarrollador), permite identificar errores (cuando los test dejan de funcionar es muy sencillo ver todos los cambios que se hicieron entre el momento actual y la ltima subida al repositorio, ... Otra alternativa a Subversion puede ser CVS. Este es otro servidor de control de versiones ampliamente extendido, pero el subversion aporta ciertas ventajas, como es el versionado de metadatos y directorios, y el ser capaz de identificar el estado de todo el repositorio en un punto determinado del tiempo con un solo identificador de revisin (de esta manera, sabiendo el nmero de revisin podemos obtener una foto completa de todo el repositorio en ese momento del tiempo).
Facilitador: Ing. Luis Vargas L. 60

Maven es una herramienta que permite automatizar el proceso de construccin y empaquetado del software. Las herramientas del estilo del Maven son el complemento perfecto para el Subversion, ya que de no usarlas el proceso de compilacin y empaquetado tendra que ser manual, y por lo tanto muy propenso a errores (qu pasa si la persona que normalmente lo hace no ha venido, o qu pasa si se olvida un paso, o ...). Todos estos errores van a causar que hagamos instalaciones en preproduccin, o incluso en produccin, de sistemas para los que no somos capaces de identificar el cdigo fuente. El gran problema de esta situacin vendr cuando alguno de nuestros clientes nos reporte una incidencia, y seamos incapaces de reproducirla en nuestro entorno debido a que no estamos trabajando con los mismos fuentes. En Java, otra alternativa tpica a Maven sera Ant. Se recomienda encarecidamente el Maven frente al Ant por las innumerables ventajas que aporta el primero. Por ejemplo, Maven da un ciclo de vida estndar para la construccin, pruebas, empaquetado, ... Maven trae de serie un sistema para la gestin de dependencias tanto directas como indirectas (esto es fundamental para saber contra que libreras estamos compilando nuestro cdigo). Tambin genera documentacin, se integra con multitud de herramientas, ... y todo sin escribir una sola lnea de script (el principal problema de Ant es que es un "lenguaje" de script y al final todo el mundo hace lo mismo pero de formas distintas, es decir, no hay dos scripts de Ant iguales).

8. Web Services
Introduccin Un servicio web, es un servicio ofrecido por una aplicacin que expone su lgica a clientes de cualquier plataorma mediante una interfaz accesible a travs de la red utilizando tecnologas (protocolos) estndar de Internet. Por ejemplo, una aplicacin como Access est formada por un conjunto de componentes que ofrecen una serie de servicios, como el acceso a datos, la impresin e informes, el diseo de tablas.. La idea de los servicios es la misma, aunque stos no tienen por qu estar en el mismo ordenador que el cliente y adems son accedidos a travs de un servidor Web y de un modo independiente de la plataforma, utilizando protocolos estndar (HTTP, SOAP, WSDL UDDI).

Facilitador: Ing. Luis Vargas L.

61

Para crear un servicio web puede utilizarse cualquiera de los lenguajes, en nuestro caso utilizaremos la plataforma JAVA. Una vez creado el servicio, para conseguir que sea accesible por los consumidores, es necesario describirlo utilizando un lenguaje estndar llamado WSDL (Web Service Description Language).

Los clientes del servicio podrn estar creados en cualquier lenguaje y ejecutarse sobre cualquier sistema operativo y hardware, lo nico necesario es que sean capaces de obtener y entender la descripcin WSDL de un servicio. Un archivo WSDL es, en realidad, un archivo XML en el que se identifica el servicio y se indica el esquema para poder utilizarlo, as como el protocolo o protocolos que es posible utilizar. Una vez dispone de esta informacin, el cliente puede comunicarse con el servicio utilizando protocolos como http o SOAP (SOAP aade invocacin de mtodos a http, aunque es posible hacerlo con peticiones HTTP-GET y/o HTTP-POST en lugar de SOAP).
Facilitador: Ing. Luis Vargas L. 62

Tipos Remote Procedure Calls (RPC, Llamadas a Procedimientos Remotos): Los Servicios Web basados en RPC presentan una interfaz de llamada a procedimientos y funciones distribuidas, lo cual es familiar a muchos desarrolladores. Tpicamente, la unidad bsica de este tipo de servicios es la operacin WSDL (WSDL es un descriptor del Servicio Web, es decir, el homologo del IDL para COM). Las primeras herramientas para Servicios Web estaban centradas en esta visin. Algunos lo llaman la primera generacin de Servicios Web. Esta es la razn por la que este estilo est muy extendido. Sin embargo, ha sido algunas veces criticado por no ser dbilmente acoplado, ya que suele ser implementado por medio del mapeo de servicios directamente a funciones especficas del lenguaje o llamadas a mtodos. Muchos especialistas creen que este estilo debe desaparecer. Arquitectura Orientada a Servicios (Service-oriented Architecture, SOA). Los Servicios Web pueden tambin ser implementados siguiendo los conceptos de la arquitectura SOA, donde la unidad bsica de comunicacin es el mensaje, ms que la operacin. Esto es tpicamente referenciado como servicios orientados a mensajes. Los Servicios Web basados en SOA son soportados por la mayor parte de desarrolladores de software y analistas. Al contrario que los Servicios Web basados en RPC, este estilo es dbilmente acoplado, lo cual es preferible ya que se centra en el contrato proporcionado por el documento WSDL, ms que en los detalles de implementacin subyacentes. REST (REpresentation State Transfer). Los Servicios Web basados en REST intentan emular al protocolo HTTP o protocolos similares mediante la restriccin de establecer la interfaz a un conjunto conocido de operaciones

Documento WSDL Un ejemplo de la estructura de un documento WSDL es el siguiente: <?xml version="1.0"?> <definitions> <types> ... </types> <message> ... </message>
Facilitador: Ing. Luis Vargas L. 63

<portType> ... </portType> <binding> ... </binding> </definitions> Donde: Elemento WSDL <?xml version=1.0> Descripcin Un documento WSDL es como cualquier documento XML y se basa en los esquemas, por lo que debe comenzar con dicha etiqueta. Comienzo del documento, este tag agrupa a todos los dems elementos Se definen los tipos de datos utilizados en los mensajes. Se utilizan los tipos definidos en la especificacin de esquemas XML. Se definen los mtodos y parmetros para realizar la operacin. Cada message puede consistir en una o ms partes (parmetros). Las partes pueden ser de cualquiera de los tipos definidos en la seccin anterior. Esta seccin es la ms importante, ya que definen las operaciones que pueden ser realizadas, y los mensajes que involucran (por ejemplo el mensaje de peticin y el de respuesta). Se definen el formato del mensaje y detalles del protocolo para cada portType.

<definitions>

<types>

<message>

<portType>

<binding>

En la etiqueta <definitions> podemos tener los siguientes atributos:


xmlnsc Namespace al que pertenece el WSDL, http://schemas.xmlsoap.org/wsdl/ name Podemos tener que el Servicio Web introduzca el nombre del propio servicio en el momento de crear el WSDL. En realidad, se utiliza la etiqueta <service name=MiServicioWeb> para indicar el nombre del servicio, depende de la antigedad del servicio y de la tecnologa que se haya utilizado para crearlo.
Facilitador: Ing. Luis Vargas L. 64

Por tanto, dentro del rbol <service> podemos tener los siguientes atributos e hijos:

name Como hemos dicho antes, ste atributo indica el nombre del Servicio Web. <documentation> Dentro del arbol del Servicio se puede abrir otra etiqueta para incluir una descripcin del servicio. <port> Aqu se indica la direccin y el tipo de acceso de los Servicios Web. Podra ser: 1. SOAP con <soap:address location=http://localhost:8082/MiServicio/Servicio1.wsdl /> 2. HTTP GET con <http:address location=http://localhost:8082/MiServicio/wsdl/Servicio.jsp />

API de JAXB Java Architecture for XML Binding (JAXB) permite a los desarrolladores Java asignar clases de Java a representaciones XML. JAXB proporciona dos caractersticas principales: la capacidad de serializar las referencias de objetos Java a XML y la inversa, es decir, deserializar XML en objetos Java. En otras palabras, JAXB permite almacenar y recuperar datos en memoria en cualquier formato XML, sin la necesidad de implementar un conjunto especfico de rutinas de carga y guardado de XML para la estructura de clases del programa. Es similar a xsd.exe y XmlSerializer en .NET Framework. JAXB es particularmente til cuando la especificacin es compleja y cambiante. En tal caso, cambiar regularmente las definiciones de XML Schema para mantenerlas sincronizadas con las definiciones de Java puede llevar mucho tiempo y ser propenso a errores. JAXB es una parte de la plataforma Java SE y una de las APIs de la plataforma Java EE, y es parte del Java Web Services Development Pack (JWSDP). Tambin es uno de los fundamentos para WSIT. JAXB es parte de la versin 1.6 SE. JAXB 1.0 fue desarrollado bajo el Java Community Process como JSR 31.1 A fecha de 2006, JAXB 2.0 est siendo desarrollado bajo JSR 222.2 Las implementaciones de referencia para estas especificaciones estn disponibles bajo la licencia de cdigo abierto CDDL en java.net.

Facilitador: Ing. Luis Vargas L.

65

9. Rest Web Services


REST (Representational State Transfer) es un estilo de arquitectura de software para sistemas hipermedias distribuidos tales como la Web. El trmino fue introducido en la tesis doctoral de Roy Fielding en 2000, quien es uno de los principales autores de la especificacin de HTTP. En realidad, REST se refiere estrictamente a una coleccin de principios para el diseo de arquitecturas en red. Estos principios resumen como los recursos son definidos y diseccionados. El trmino frecuentemente es utilizado en el sentido de describir a cualquier interfaz que transmite datos especficos de un domino sobre HTTP sin una capa adicional, como hace SOAP. Estos dos significados pueden chocar o incluso solaparse. Es posible disear un sistema software de gran tamao de acuerdo con la arquitectura propuesta por Fielding sin utilizar HTTP o sin interactuar con la Web. As como tambin es posible disear una simple interfaz XML+HTTP que no sigue los principios REST, y en cambio seguir un modelo RPC. Cabe destacar que REST no es un estndar, ya que es tan solo un estilo de arquitectura. Aunque REST no es un estndar, est basado en estndares: HTTP URL Representacin de los recursos: XML/HTML/GIF/JPEG/ Tipos MIME: text/xml, text/html, Cul es la motivacin de REST? La motivacin de REST es la de capturar las caractersticas de la Web que la han hecho tan exitosa. Si pensamos un poco en este xito, nos daremos cuenta que la Web ha sido la nica aplicacin distribuida que ha conseguido ser escalable al tamao de Internet. El xito lo debe al uso de formatos de mensaje extensibles y estndares, pero adems cabe destacar que posee un esquema de direccionamiento global (estndar y extensible a su vez). En particular, el concepto central de la Web es un espacio de URIs unificado. Las URIs permiten la densa red de enlaces que permiten a la Web que sea tan utilizada. Por tanto, ellos consiguen tejer una mega-aplicacin. Rafael Navarro Marset. Modelado, Diseo e Implementacin de Servicios Web 2006-07 REST vs Web Services 5/19

Facilitador: Ing. Luis Vargas L.

66

Las URIs identifican recursos, los cuales son objetos conceptuales. La representacin de tales objetos se distribuye por medio de mensajes a travs de la Web. Este sistema es extremadamente desacoplado. Estas caractersticas son las que han motivado para ser utilizadas como gua para la evolucin de la Web. Cules son los principios de REST? El estilo de arquitectura subyacente a la Web es el modelo REST. Los objetivos de este estilo de arquitectura se listan a continuacin: Escalabilidad de la interaccin con los componentes. La Web ha crecido exponencialmente sin degradar su rendimiento. Una prueba de ellos es la variedad de clientes que pueden acceder a travs de la Web: estaciones de trabajo, sistemas industriales, dispositivos mviles, Generalidad de interfaces. Gracias al protocolo HTTP, cualquier cliente puede interactuar con cualquier servidor HTTP sin ninguna configuracin especial. Esto no es del todo cierto para otras alternativas, como SOAP para los Servicios Web. Puesta en funcionamiento independiente. Este hecho es una realidad que debe tratarse cuando se trabaja en Internet. Los clientes y servidores pueden ser puestas en funcionamiento durante aos. Por tanto, los servidores antiguos deben ser capaces de entenderse con clientes actuales y viceversa. Disear un protocolo que permita este tipo de caractersticas resulta muy complicado. HTTP permite la extensibilidad mediante el uso de las cabeceras, a travs de las URIs, a travs de la habilidad para crear nuevos mtodos y tipos de contenido. Compatibilidad con componentes intermedios. Los ms populares intermediaros son varios tipos de proxys para Web. Algunos de ellos, las caches, se utilizan para mejorar el rendimiento. Otros permiten reforzar las polticas de seguridad: firewalls. Y por ltimo, otro tipo importante de intermediarios, gateway, permiten encapsular sistemas no propiamente Web. Por tanto, la compatibilidad con intermediarios nos permite reducir la latencia de interaccin, reforzar la seguridad y encapsular otros sistemas. REST logra satisfacer estos objetivos aplicando cuatro restricciones: Identificacin de recursos y manipulacin de ellos a travs de representaciones. Esto se consigue mediante el uso de URIs. HTTP es un protocolo centrado en URIs. Los recursos son los objetos lgicos a los que se le envan mensajes. Los recursos no pueden ser directamente accedidos o modificados. Ms bien se trabaja con representaciones de ellos. Cuando se utiliza un mtodo PUT para enviar informacin, se coge como una representacin de lo que nos gustara que Rafael Navarro Marset. Modelado, Diseo e Implementacin de Servicios Web 2006-07 REST vs Web Services 6/19
Facilitador: Ing. Luis Vargas L. 67

el estado del recurso fuera. Internamente el estado del recurso puede ser cualquier cosa desde una base de datos relacional a un fichero de texto. Mensajes autodescriptivos. REST dicta que los mensajes HTTP deberan ser tan descriptivos como sea posible. Esto hace posible que los intermediarios interpreten los mensajes y ejecuten servicios en nombre del usuario. Uno de los modos que HTTP logra esto es por medio del uso de varios mtodos estndares, muchos encabezamientos y un mecanismo de direccionamiento. Por ejemplo, las cachs Web saben que por defecto el comando GET es cacheable (ya que es side-effectfree) en cambio POST no lo es. Adems saben como consultar las cabeceras para controlar la caducidad de la informacin. HTTP es un protocolo sin estado y cuando se utiliza adecuadamente, es posible es posible interpretar cada mensaje sin ningn conocimiento de los mensajes precedentes. Por ejemplo, en vez de logearse del modo que lo hace el protocolo FTP, HTTP enva esta informacin en cada mensaje. Hipermedia como un mecanismo del estado de la aplicacin. El estado actual de una aplicacin Web debera ser capturada en uno o ms documentos de hipertexto, residiendo tanto en el cliente como en el servidor. El servidor conoce sobre le estado de sus recursos, aunque no intenta seguirle la pista a las sesiones individuales de los clientes. Esta es la misin del navegador, el sabe como navegar de recurso a recurso, recogiendo informacin que el necesita o cambiar el estado que el necesita cambiar. En la actualidad existen millones de aplicaciones Web que implcitamente heredan estas restricciones de HTTP. Hay una disciplina detrs del diseo de sitios Web escalables que puede ser aprendida de los documentos de arquitectura Web o de varios estndares. Por otra parte, tambin es verdad que muchos sitios Web comprometen uno ms de estos principios, como por ejemplo, seguir la pista de los usuarios movindose a travs de un sitio. Esto es posible dentro de la infraestructura de la Web, pero daa la escalabilidad, volviendo un medio sin conexin en todo lo contrario. Los defensores de REST han credo que estas ideas son tan aplicables a los problemas de integracin de aplicaciones como los problemas de integracin de hipertexto. Fielding es bastante claro diciendo que REST no es la cura para todo. Algunas de estas caractersticas de diseo no sern apropiadas para otras aplicaciones. Sin embargo, aquellos que han decidido adoptar REST como un modelo de servicio Web sienten que al menos articula una filosofa de diseo con fortaleza, debilidades y reas de aplicabilidad documentada. Cmo sera un ejemplo de diseo basado en REST? De nuevo tomaremos como ejemplo a la Web. La Web evidentemente es un ejemplo clave de diseo basado en REST, ya que muchos principios son la base de REST. Posteriormente mostraremos un posible ejemplo real aplicado a Servicios Web. Rafael Navarro Marset. Modelado, Diseo e Implementacin de Servicios Web 2006-07 REST vs Web Services 7/19
Facilitador: Ing. Luis Vargas L. 68

La Web consiste del protocolo HTTP, de tipos de contenido, incluyendo HTML y otras tecnologas tales como el Domain Name System (DNS). Por otra parte, HTML puede incluir javascript y applets, los cuales dan soporte al code-on-demand, y adems tiene implcitamente soporte a los vnculos. HTTP posee un interfaz uniforme para acceso a los recursos, el cual consiste de URIs, mtodos, cdigos de estado, cabeceras y un contenido guiado por tipos MIME. Los mtodos HTTP ms importantes son PUT, GET, POST y DELETE. Ellos suelen ser comparados con las operaciones asociadas a la tecnologa de base de datos, operaciones CRUD: CREATE, READ, UPDATE, DELETE. Otras analogas pueden tambin ser hechas como con el concepto de copiar-y-pegar (Copy&Paste). Todas las analogas se representan en la siguiente tabla: Accin Create Read Update Delete HTTP SQL Copy&Paste Unix Shell

PUT GET POST DELETE

Insert Select Update Delete

Pegar Copiar Pegar despus Cortar

> < >> Del/rm

Qu pasar con REST? Los negocios electrnicos van a necesitar algo ms que tecnologas orientadas en RPC. Todos los negocios de cualquier lugar tendrn que estandarizar sus modelos de direccionamiento para exponer las interfaces en comn a sus socios. SOAP no permite esto en si mismo, incluso confunde ms que aclara. Para que los negocios interoperen sin programar manualmente de manera explcita enlaces a los socios, se necesitar estandarizar un modelo de direccionamiento, ms que invertir en sistemas propietarios. REST proporciona un alto grado de estandarizacin. Por tanto, si los servicios Web basados en SOAP no consiguen implantar este mecanismo, no sobrevivirn y, por tanto, surgir la era de los Servicios Web basados en REST. Dnde es til REST? Tanto los arquitectos como los desarrolladores necesitan decidir cual es el estilo adecuado para las aplicaciones. En algunos casos es adecuado un diseo basado en REST, se listan a continuacin: El servicio Web no tiene estado. Una buena comprobacin de esto consistira en considerar si la interaccin puede sobrevivir a un reinicio del servidor. Una infraestructura de caching puede mejorar el rendimiento. Si los datos que el servicio Web devuelve no son dinmicamente generados y
Facilitador: Ing. Luis Vargas L. 69

pueden ser cacheados, entonces la infraestructura de caching que los servidores Web y los intermediarios proporcionan, pueden incrementar el rendimiento. Tanto el productor como el consumidor del servicio conocen el contexto y contenido que va a ser comunicado. Ya que REST no posee todava (aunque hayamos visto una propuesta interesante) un modo estndar y formal de describir la interfaz de los servicios Web, ambas partes deben estar de acuerdo en el modo de intercambiar de informacin. El ancho de banda es importante y necesita ser limitado. REST es particularmente til en dispositivos con escasos recursos como PDAs o telfonos mviles, donde la sobrecarga de las cabeceras y capas adicionales de los elementos SOAP debe ser restringida. La distribucin de Servicios Web o la agregacin con sitios Web existentes puede ser fcilmente desarrollada mediante REST. Los desarrolladores pueden utilizar tecnologas como AJAX y toolkits como DWR (Direct Web Remoting) para consumir el servicio en sus aplicaciones Web.

Facilitador: Ing. Luis Vargas L.

70

10.

Seguridad Java EE

Antes de nada vamos a dar una gua de buenas prcticas que es interesante conocer antes de empezar a construir aplicaciones para conseguir un trabajo lo ms bueno posible.

No dar nunca nada por hecho ni en cuestiones de seguridad ni en cuestiones del flujo normal de la aplicacin. Todo el riesgo que se corra debe ser por parte del usuario (no hay nada que hacer contra eso). Me explico, no supongamos que si le pido el nombre al usuario no me va a poner un nmero de telfono. No se si sera una forma acertada de decirlo pero hay que pensar con pesimismo, en los peores casos, y por remotos que sean pueden ocurrir. Siempre que usemos servicios externos estamos asumiendo riesgos aadidos. Podemos haber hecho una pgina web muy segura y muy bien construida, pero si incrustamos contenido externo nadie nos asegura que el contenido externo sea vulnerable a algn tipo de ataque. La oscuridad no es seguridad. No poner un botn acceso a la administracin no impide que se pueda acceder a ella. Ocultar nuestro cdigo no debe ser parte de nuestra seguridad. Principio del mnimo privilegio: El usuario del sistema debe tener nicamente los privilegios que necesita para llevar a cabo su actividad. Fallar de manera segura: Hay que tratar de manera muy cuidadosa los fallos en la aplicacin. Por poner un ejemplo, si se produce un fallo en la aplicacin mientras se realizan tareas administrativas no debe seguir iniciada la sesin como administrador. Otro ejemplo, no debe mostrar en un fallo informacin tcnica sobre el mismo al usuario del sistema. Si el usuario sabe datos acerca de nuestro sistema podra tener ms fcil la bsqueda de vulnerabilidades.

Los riesgos Ahora que hemos dado unos pequeos consejos sobre seguridad a la hora de la construccin de aplicaciones ya podemos pasar a explicar los riesgos que hay en las aplicaciones web. No vamos a ponernos a programar nada sin saber los riesgos existentes y el porque de las medidas que se toman para combatirlos. Voy a nombrar aqu los riesgos que considero ms importantes.

Inyeccin SQL: Consiste en intentar engaar al sistema para que realice peticiones contra la base de datos que no son las que han sido programadas y que podran comprometer gravemente la base de datos o incluso mostrar al atacante toda la informacin de la misma.
Facilitador: Ing. Luis Vargas L. 71

Cross Site Scripting: El atacante intentar enviar informacin a nuestro servidor por medio de nuestros formularios u otros medios con la intencin de que dicha informacin sea almacenada en nuestra base de datos y posteriormente sea mostrada a los dems usuarios del sistema. Un ejemplo sencillo: Un cdigo JavaScript que borre el contenido de la pgina, si eso es mostrado a los dems usuarios de la aplicacin vern siempre una pgina en blanco. Esto es un ejemplo sencillo, pero imaginarios que lo que se consigue introducir es un cdigo que tome el control de los navegadores de los usuarios de la aplicacin web. Robo de sesin: Como sabemos HTTP es un protocolo sin estados, lo que significa que las credenciales o informacin de sesin deber ir en cada peticin; debido a esto dichos datos resultan muy expuestos. Un robo de estos datos podra tener como resultado que alguien se estuviera haciendo pasar por nosotros y realizando acciones con unos privilegios que nos pertenecen. Y tampoco hemos de olvidar que se pude robar la sesin intentando obtener nuestros credenciales de alguna manera (averiguar nuestra contrasea). Acceso a URLs restringidas: Consiste en la observacin de una URL e intentar cambiarla para intentar acceder a otras zonas. Estas es una de las razones por las que la seguridad a travs de la ocultacin no es efectiva.

Solucionando los problemas de seguridad Ahora que ya hemos identificado y visto en que consisten los problemas que nos podemos encontrar en las aplicaciones web, o al menos lo ms importantes y peligrosos vamos a ir uno por uno explicando como hemos de solucionarlos. Iremos primero a los dos ltimos que son los ms sencillos y en posteriores entradas explicaremos la solucin a los dos primeros que son los ms importantes de los cuatro y quiero dedicarles una entrada completa. Robo de sesin Ya hemos visto el riesgo que tiene el robo de una sesin. Podramos decir de manera resumida que el peligro est en la exposicin de los datos de sesin. En la ilustracin de la presentacin de seguridad que hice podemos ver una posible situacin de robo de sesin.

Facilitador: Ing. Luis Vargas L.

72

Para solucionar este problema de seguridad hay que atenerse a varios aspectos de la seguridad: la autentificacin y la sesin; para cada uno de ellos veremos varios aspectos importantes a cubrir para solucionar problemas con el robo de sesin. La Autentificacin

El ms importante de todos. Usar SSL sobre HTTP (HTTPS) para transferir los datos y asegurarse de que el cifrado cubre los credenciales y el ID de sesin en todas las comunicaciones. De esta manera los datos de sesin de los que hablbamos siguen estando expuestos pero esta vez se encuentran cifrados, por lo que no se pueden usar. Alguien podra pensar: Y si se obtiene la sesin y se rompe la encriptacin?, la respuesta es sencilla, y es que con los medios actuales para cuando hayas conseguido romper la encriptacin esa sesin habr dejado de existir. Usar un sistema de autentificacin simple, centralizado y estandarizado. Es mejor que usemos mtodos de autentificacin que nos proporcione el propio servidor de aplicaciones en vez de soluciones implementadas por nosotros, debido a que lo que implementa el servidor de aplicaciones es usado en muchos lugares y ha sido suficientemente probado. Por ejemplo los filtros de Java EE (que veremos posteriormente) o los mtodos de autentificacin que proporciona Java EE (no los he usado).
Facilitador: Ing. Luis Vargas L. 73

Posibilitar el bloqueo de autentificacin despus de un nmero determinado de intentos fallidos. Esto podra evitar ataques de fuerza bruta intentando averiguar la contrasea del usuario. Implementar mtodos seguros de recuperacin de contraseas: Es comn que se intenten usar estos mtodos para intentar ganar acceso a una cuenta del usuario, podemos ver una serie de consejos para implementar estos mtodos. Pedir al usuario al menos tres datos o ms, obligar a que responda preguntas de seguridad. La contrasea que recuperada deber generarse de manera aleatoria (con una longitud de al menos 8 caracteres) y enviada al usuario por un canal diferente (Email); de esta forma si el atacante consigui sortear los primeros pasos es difcil que logre sortear el canal usado para transmitir.

La Sesin

Usar los mtodos de sesin que nos proporciona el servidor de aplicaciones que estemos usando, y digo esto por las mismas razones que aconsej usar los mtodos de autentificacin que proporciona el servidor de aplicaciones. En este caso no estamos refiriendo a la sesin y a las cookies. Asegurar que la operacin de cierre de sesin realmente destruye dicha sesin. Tambin fijar el periodo de expiracin de la sesin (periodo de tiempo en el que no se realice ninguna accin bajo dicha sesin); por ejemplo para aplicaciones crticas de 2 a 5 minutos, mientras que para otras aplicaciones ms comunes se podra usar de 15 a 30 minutos.

En el descriptor de despliegue podemos fijar la caducidad de la sesin en minutos. XHTML


<session-config> <session-timeout>15</sessio </session-config>

1 <session-config> 2 <session-timeout>15</session-timeout>

3 </session-config> Ahora que hemos visto las formas de evitar el robo de sesin; o al menos de manera terica, ahora vamos a ver como se hacen esta serie de cosas en la prctica.

Facilitador: Ing. Luis Vargas L.

74

Hemos hablado de usar mtodos proporcionados por el servidor de aplicaciones para realizar la autenticacin usando filtros y la sesin. Vamos a ver en concreto como podra hacerse. En primer lugar habr que comprobar si los datos de usuario son correctos y posteriormente se podra hacer algo como aadir algn parmetro a la sesin indicando que esta autenticada. Voy a simplificar mucho un cdigo para que nos centremos en lo fundamental. Java
if (passw ord.equals(user.getPa //Se aade a la sesin un boo request.getSession().setAttri

1 if (password.equals(user.getPass()) == true) { 2 3 4 5 6 7} Respecto a bloquear el inicio de sesin despus de un nmero determinado de intentos fallidos podra ser tan fcil como aadir a la sesin el nmero de intentos fallidos y en el caso de que superen un determinado nmero no ejecutar ningn mecanismo de autenticacin ni mostrar el formulario de login, nicamente habra que lanzar un timer para desbloquear el inicio de sesin pasado un tiempo. Java
protected void starTimer(final H //Tarea que se lanzar cuand TimerTask timerTask = new T

//Se aade a la sesin un boolean indicando que est autentificado request.getSession().setAttribute("auth", true);

//Se aade a la sesin el identificador del usuario request.getSession().setAttribute("usuario", user.getMail());

1 protected void starTimer(final HttpSession sesion) { 2 3 4


Facilitador: Ing. Luis Vargas L. 75

//Tarea que se lanzar cuando el Timer la ejecute TimerTask timerTask = new TimerTask() {

5 6 7 8 9 10 11 12 13 14 } };

@Override public void run() { sesion.invalidate(); }

Timer timer = new Timer (); //El tiempo esta en milisegundos y se lanza la tarea que definimos anteriormente timer.schedule(timerTask, 600000);

Luego, para comprobar este parmetro (el que se ha aadido a la sesin para comprobar si se ha autentificado o no) sera factible usar filtros para todas las URLs para las que se necesite permiso y en ellos comprobar si existe el parmetro aadido en la sesin o no. Lo primero de todo en el descriptor de despliegue (web.xml) hemos de configurar el filtro. Definiremos el filtro para un patrn de URL, en este caso todas las estn dentro del directorio /admin. Como sabemos los filtros actan ante las peticiones de cliente para los patrones de URL para los que estn definidos. Es esto del todo cierto? Pues no, en Java EE 6 esto ha cambiado un poco y podemos especificar que un filtro se ejecute sin necesidad de que el cliente haga una peticin, simplemente con que el servidor haga una redireccin porque as lo especifique el cdigo (repito, sin que el cliente tenga nada que ver y sin que sepa nada de esa redireccin). Podemos hacer esto mediante las sentencias que he dejado resaltadas. XHTML
<!-- Filtro de zona privada--> <filter> <filter-name>AdminFilter</filte <filter-class>control.admin.Ad

1 <!-- Filtro de zona privada--> 2 <filter> 3 <filter-name>AdminFilter</filter-name>


Facilitador: Ing. Luis Vargas L. 76

<filter-class>control.admin.AdminFilter</filter-class>

5 </filter> 6 7 <filter-mapping> 8 9 10 11 12 13 <filter-name>AdminFilter</filter-name> <url-pattern>/admin/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher>

14 </filter-mapping> Ahora veremos la clase que implementa el filtro y veremos que es a la misma clase a la que se hace referencia en el descriptor de despliegue. En ella simplemente se comprueba la existencia de los parmetros que se aadieron a la sesin en el proceso de autenticacin. Los nombres de las variables son claros por lo que no he hecho comentarios, me parece que se ve claro el objetivo del cdigo Unicamente comentar que un Servlet no es exclusivo de una aplicacin web, un ServletHttp es una clase de Servlet especial por as decirlo, de ah que con el ServletRequest que nos da el filtro no podamos obtener la sesin y por eso necesitamos la primera lnea del mtodo doFilter en la que se hace un casting. Java
package control.admin; import java.io.IOException;

1 package control.admin; 2 3 import java.io.IOException; 4 import javax.servlet.Filter;

Facilitador: Ing. Luis Vargas L.

77

5 import javax.servlet.FilterChain; 6 import javax.servlet.FilterConfig; 7 import javax.servlet.RequestDispatcher; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.http.HttpServletRequest; 12 13 /** 14 * @author Juan Dez-Yanguas Barber 15 */ 16 public class AdminFilter implements Filter { 17 18 19 20 21 22 23 @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //Obtenemos un HttpServletRequest con un casting HttpServletRequest requestMod = ((HttpServletRequest) request); if (isPermited(requestMod) == false){

requestMod.getSession().setAttribute("requestedPage", 24 requestMod.getRequestURL().toString()); 25 RequestDispatcher noPermited = 26 request.getRequestDispatcher("/WEB-INF/paginasError/restricted.jsp"); 27 28 29 30 }


Facilitador: Ing. Luis Vargas L. 78

noPermited.forward(request, response); }else{ //Continua la secuencia de ejecucin normal chain.doFilter(request, response);

31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 }

private boolean isPermited(HttpServletRequest request) { if (request.getSession().getAttribute("auth") == false || request.getSession().getAttribute("usuario") == null) { return false; } else{ return true; } }

@Override public void init(FilterConfig filterConfig) throws ServletException { }

@Override public void destroy() { }

Ahora veremos como cerrar la sesin de la manera ms correcta. Lo ms correcto sera destruir la sesin, de esta manera nuestra sesin dejar de existir a todos los efectos. Para ello usaremos la siguiente sentencia, cuya funcin es destruir la sesin. La podramos usar por ejemplo en un Servlet encargado del cierre de sesin. Java
request.getSession().invalidate(

Facilitador: Ing. Luis Vargas L.

79

1 request.getSession().invalidate(); Respecto al tema de las contraseas voy a dedicar al final de esta entrada un apartado donde explicar como trabajar correctamente con ellas. Acceso a URLs restringidas Como ya hemos visto en el apartado terico sobre este problema la seguridad a travs de la ocultacin no sirve de nada. Si por ejemplo para la parte pblica se usara un patrn de URL /public el atacante podra pensar que la parte privada pudiera ser /admin o cosas parecidas, con no dar a conocer el detalle de ese directorio no es suficiente, hay que protegerlo. Como a estas alturas supondremos no hay que hacer nada especial si se ha realizado lo anterior, es decir, si hemos realizado una autenticacin y un control de sesin correctos. Con el uso de los filtros podramos solucionar este problema perfectamente. Se que es un problema que a la vista parece bastante evidente y con una solucin sencilla; pero mientras siga apareciendo como uno de los problemas ms graves de seguridad ser porque no est tan bien solucionado aunque sea evidente el problema y la solucin. Trabajando correctamente con contraseas Las contraseas son un dato delicado, la palabra secreta que usa el usuario para acceder a su cuenta en el sitio web, algo suyo y personal. Por este motivo nicamente el usuario debera conocer su contrasea. Ahora bien, si solo conoce l la contrasea Cmo la comprobamos cuando inicie sesin? Vamos a ver que si que es posible hacerlo sin conocer la contrasea; lo haremos usando una huella digital MD5 o SHA1 (he puesto los enlaces en ingls, me parecan ms completos). En definitiva estos dos son los algoritmos ms usados para la generacin de huellas digitales, consistentes en crear una suma siempre de igual longitud independientemente del tamao del mensaje y con la particularidad de que no se puede volver al mensaje original a partir del mensaje encriptado; pero un mismo mensaje siempre genera el mismo cdigo. Java
//Mtodo para generar la huella public static String generateMD5 try { //Cambiando MD5 por SHA

1 //Mtodo para generar la huella MD5

Facilitador: Ing. Luis Vargas L.

80

2 public static String generateMD5Signature(String input) { 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 } A sabiendas de lo anterior podramos darnos cuenta de que si en vez de guardar la contrasea de los usuarios guardamos la huella digital de la misma podremos verificar su identidad cuando l inicie sesin, y no tendremos su
Facilitador: Ing. Luis Vargas L. 81

try { //Cambiando MD5 por SHA-1 podramos obtener la huella usando este otro algoritmo MessageDigest md = MessageDigest.getInstance("MD5"); byte[] huella = md.digest(input.getBytes()); return transformaAHexadecimal(huella); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(Tools.class.getName()).log(Level.SEVERE, "No se ha encontrado el algoritmo MD5", ex); return "-1"; } }

//Mtodo para transformar el array de bytes en una cadena hexadecimal private static String transformaAHexadecimal(byte buf[]) { StringBuilder strbuf = new StringBuilder(buf.length * 2); for (int i = 0; i < buf.length; i++) { if (((int) buf[i] & 0xff) < 0x10) { strbuf.append("0"); } strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); } return strbuf.toString();

contrasea guardada ni modo alguno de obtenerla. Lo que habr que hacer es obtener la huella de su contrasea cuando el usuario la introduzca y la compararemos con la huella que nosotros tenamos guardada. As estaremos protegiendo al usuario; si nuestra base de datos se viese comprometida y llegamos a tener guardadas las contraseas todos nuestros usuarios estaran expuestos, mientras que de esta manera que explico esto no ocurrira. Es este mtodo infalible? Pues no, existen tablas de huellas de palabras clave que se suelen usar, ya se sabe que no solemos ser bastante ocurrentes poniendo las palabras clave (solemos usar 1234, password, etc), as que si disponen de una tabla de este tipo podran obtener las contraseas a partir de las huellas de nuestra base de datos comprometida (si bien no obtendrn todas, alguna seguro que s). Pues bien, an con estos problemas nos quedan armas a usar. Si en vez de guardar las huellas de las contraseas, guardamos las huellas de las contraseas sumado con algo ms. Si obtienen el mensaje que form esa huella con una tabla de esas obtendran la contrasea ms eso que aadimos nosotros, luego no obtienen la contrasea. Y esto podra admitir muchas variaciones, como poner caracteres por enmedio de la contrasea, al final, al principio, lo que se aada a la contrasea podra ser tan complejo como desearamos. Pero sin olvidarse que al comprobar la contrasea habr que hacer el mismo proceso. Vamos a ver un ejemplo sencillo, mostraremos como se introduce la contrasea cuando el usuario se registra y como se comprueba cuando inicia sesin. En este caso vamos a aadir al final de la contrasea el nombre de usuario del sistema (Podra haber problemas si se cambiara el nombre de usuario en la mquina, pero no me voy a centrar en eso ahora, esto pretende ser solo un ejemplo ilustrativo). Java
String pass = request.getParam pass = Tools.generateMD5Signa

1 2

String pass = request.getParameter("pass"); pass = Tools.generateMD5Signature(pass + System.getProperty("user.name"));

Veamos ahora el proceso de comprobacin (user ser el usuario que tenemos guardado ya en la base de datos y del cual tenemos su huella de la contrasea ms el aadido).
Facilitador: Ing. Luis Vargas L. 82

Java
String pass = request.getParam if (Tools.generateMD5Signature //Contrasea correcta } else {

1 2 3 4 5 6

String pass = request.getParameter("pass"); if (Tools.generateMD5Signature(password + System.getProperty("user.name")).equals(user.getPass()) == true) { //Contrasea correcta } else { //Contrasea incorrecta }

Ahora la cuestin viene cuando hacemos un mtodo para recuperar la contrasea, no la podemos recuperar de forma alguna, no la hemos guardado. Por lo tanto, lo que habr que hacer es generar una nueva y asignarla al usuario y mandarle la nueva contrasea por correo. Java
//Como argumento la longitud de String new Pass = RandomString String new PassHash = Tools.ge //Asignar new PassHash al usua

1 2 3 4

//Como argumento la longitud de la contrasea String newPass = RandomStringUtils.randomAlphanumeric(19); String newPassHash = Tools.generateMD5Signature(newPass + System.getProperty("user.name")); //Asignar newPassHash al usuario

Inyeccin SQL Comenzaremos hablando por el primero de los riesgos de seguridad que se comentaban en la entrada anterior. Para hacer un breve recordatorio veamos que se trataba de intentar comprometer de alguna manera la base de datos de la aplicacin.
Facilitador: Ing. Luis Vargas L. 83

Para ello, se suelen usar los formularios de las pginas web tratando de cerrar en ellos una consulta SQL e iniciando otra a continuacin; dicho esto enviar directamente los datos de los formularios hacia una consulta SQL no es una buena prctica. Veremos en este apartado una serie de buenas prcticas que deberamos llevar a cabo para evitar la inyeccin SQL. Uso de PreparedStatements En primer lugar una muy buena prctica es cambiar el uso de los Statements por los PreparedStatements. Este tipo de Statement obliga a que la consulta tenga exactamente la estructura que se indica, y no deja que se cambie la estructura de la misma o se cierre una consulta y se abra otra nueva. Tambin lleva a cabo un escapado de caracteres, puesto que podras poner de nombre ODonnell y no habra problema alguno en poner la comilla simple. Ni que decir tiene que tambin podramos evitar la inyeccin SQL usando procedimientos almacenados. Para hacer una consulta con un PreparedStatement lo primero que se hace es indicar la estructura de la consulta dejando los parmetros marcados con una interrogacin ? y posteriormente se ir indicando que son cada una de esas interrogaciones y su tipo de dato. Y gracias a que se indica el tipo de dato, Java ya se encarga de poner las comillas que hagan falta dependiendo del tipo de dato. Veremos que hay muchos mtodos set dependiendo del tipo de dato a introducir. Veamos un ejemplo. En el ejemplo se muestra un mtodo sencillo para hacer un insert en la base de datos . He puesto el mtodo completo para que tambin se observe una buena estructura para un mtodo de este tipo. Siguiendo esta estructura es la mejor manera de asegurarse de que todos los recursos van a ser liberados en cualquier caso, tanto si se produce un error como si la ejecucin es normal. Voy a explicar al final de esta entrada en que consiste ese mtodo cerrarConexionYStatement (), ya que considero que es un punto importante a tener en cuenta para ahorrarnos unas cuantas lneas de cdigo. Java
public boolean addUser(Usuario Connection conexion = null; boolean exito = false; PreparedStatement insert = n

1 public boolean addUser(Usuario user) { 2 3 4 Connection conexion = null; boolean exito = false; PreparedStatement insert = null;

Facilitador: Ing. Luis Vargas L.

84

5 6 7 8 9 10 11 12 13 14

try { conexion = pool.getConnection(); //Definir la estructura de la consulta insert = conexion.prepareStatement("INSERT INTO " + nameBD + ".Usuarios VALUES (?,?,?,?,?)"); //Indicamos cada uno de los parmetros insert.setString(1, user.getMail()); insert.setString(2, user.getNombre()); insert.setString(3, user.getDir()); insert.setString(4, user.getPass());

//Incluso si no encontramos un mtodo set para incluir un tipo de dato 15 se puede personalizar como en este caso 16 17 18 19 20 21 22 23 24 25 26 27 } En el cdigo de la tienda online podemos encontrar numerosos mtodos de este estilo y se pueden ver ejemplos en los que se use un ResultSet e incluso } return exito; } } catch (SQLException ex) { logger.log(Level.SEVERE, "Error insertando usuario", ex); } finally { cerrarConexionYStatement(conexion, insert); int filasAfectadas = insert.executeUpdate(); if (filasAfectadas == 1) { exito = true; insert.setObject(5, user.getPermisos(), java.sql.Types.CHAR, 1);

Facilitador: Ing. Luis Vargas L.

85

algn ejemplo en el que se realizan varias transacciones dependientes entre si y se realizan rollbacks y commits manualmente. Hay que comentar que aunque no se vea siempre se realizan commits en todos los mtodos, solo que por el hecho de ser consultas simples la conexin realiza los commit de manera automtica, pero esto se puede cambiar como se puede ver en el cdigo de la tienda online. Java
conexion.setAutoCommit(false)

1 conexion.setAutoCommit(false); Realizar validaciones con expresiones regulares Esto es todo lo que podemos hacer? Pues no, podemos usar como medida de apoyo una validacin de todos los datos de entrada de los usuarios en los formularios. Para realizar esta validacin usaremos la librera que nos proporciona OWASP que se hace denominar ESAPI. Y ahora como es lgico veremos como usar esta librera y configurarla. En primer lugar hemos de bajar el paquete que nos proporcionan en el que se incluye en jar de ESAPI y todas las libreras que requiere ESAPI para funcionar (carpeta libs del paquete descargado). Hemos de aadir todas esas libreras a nuestro proyecto. Una cosa importante. Entre las libreras requeridas es posible que se incluya la librera de servlets. Esa librera no la debis de incluir en el proyecto puesto que es una versin ms antigua de los Servlets y cambian mtodos como por ejemplo la forma de acceder al contexto de la aplicacin, por lo que nos interesa conservar la especificacin de Servlets moderna que tenga nuestro servidor de aplicaciones. La siguiente parte importante son los ficheros de configuracin que necesita ESAPI para funcionar: ESAPI.properties y validation.properties. Podemos encontrar una plantilla de cada uno de los ficheros en el paquete descargado en configuration/.esapi. La siguiente tarea es colocar los ficheros de configuracin en un lugar adecuado para que se reconozcan. ESAPI buscar los ficheros en varios lugares en el orden en el que indico a continuacin. Encontraremos esta informacin en la pgina de ESAPI o de la manera que lo he hecho yo que es mirando la consola del servidor de aplicaciones.

Facilitador: Ing. Luis Vargas L.

86

INFO: Not found in 'org.ow asp.esapi. readable: /Applications/NetBeans/glassfis

INFO: Not found in 'org.owasp.esapi.resources' directory or file not readable: /Applications/NetBeans/glassfish1 3.1/glassfish/domains/domain1/ESAPI.properties 2 INFO: Not found in SystemResource Directory/resourceDirectory: .esapi/ESAPI.properties 3 INFO: Not found in 'user.home' (/Users/Usuario) directory: 4 /Users/Usuario/esapi/ESAPI.properties INFO: Attempting to load ESAPI.properties via the classpath. En mi caso me pareci lo ms cmodo incluirlo en el classpath. Para ello cree en la raiz del proyecto una carpeta llamada setup, que por otra parte es estndar que los proyectos web puedan tener esta carpeta para archivos de configuraciones, y posteriormente se ha de aadir dicha carpeta al classpath del proyecto.

Facilitador: Ing. Luis Vargas L.

87

Una vez que hemos colocado los archivos en su lugar comenzaremos configurando cada uno de ellos. Lo que se va a configurar en estos ficheros principalmente sern las expresiones regulares que se van a usar para validar cada uno de los campos que deseemos. El primer fichero que hemos nombrado, ESAPI.properties es un fichero que en lo que a nosotros nos concierne no hemos de tocar nada, la librera se sirve de l para hacer sus operaciones; nuestras personalizaciones irn en el segundo fichero nombrado. Pero no est de ms echar un ojo al fichero para ver las validaciones que ya incluye y se ver que incluye validacin para Email y alguna otra cosa ms. Mirndolo tambin veremos cual es la forma de las expresiones regulares que admite. Ahora pasemos al segundo fichero en el que hemos de configurar las expresiones regulares que consideremos necesarias. Para ello hemos de poner una clave y una atributo; al estilo de un fichero de propiedades. La clave ser siempre Validator.Campo, siendo Campo lo que usaremos posteriormente para referirnos a esa expresin regular. Esto no pretende ser un tutorial sobre como crear expresiones regulares, sin embargo har algunas anotaciones. Si alguien necesita ms ayuda con el tema puede preguntar y no tendr problema alguno en resolver sus dudas. El smbolo ^ indica el inicio de la cadena, mientras que el smbolo $ indica el final de la cadena. Es bueno escapar caracteres como el guin y el punto puesto que el guin se usa para indicar un rango y el punto significa cualquier cosa. Otra anotacin importante es que a la hora de poner caracteres regionales debis ponerlos con su correspondiente cdigo en UTF-16; si no se hace de esta manera despus puede que no funcione correctamente. Se puede encontrar una tabla de correspondencia bsica en la wikipedia. Por ejemplo, si se quiere poner una a acentuada se debe poner as \u00e1. Si tenis problemas con las expresiones regulares hay una web que podis usar que puede resultar interesante. Tambin se puede usar un software especfico para expresiones regulares que nos puede ayudar a crearlas en unos sencillos pasos y tambin nos ayudar a crearlas. Su nombre es RegexBuddy y RegexMagic. El primero de ellos es sobretodo para aprender y verificar expresiones regulares mientras que el segundo est orientado a su creacin. Veamos ahora un pequeo ejemplo que son las que us yo para la tienda online. Decir que no hace falta crear expresiones regulares para nmeros porque tiene su verificacin a parte que ya veremos. Java
Validator.Pss=^[A-Za-z0-9._$% Validator.Name=^[A-Z][a-zA-Z Validator.Adress=^[A-Z][a-zA-Z Validator.NameDescProd=^[A-Z

Facilitador: Ing. Luis Vargas L.

88

1 2 3 4

Validator.Pss=^[A-Za-z0-9._$%&/()= -#@]+$ Validator.Name=^[A-Z][a-zA-Z -]+$ Validator.Adress=^[A-Z][a-zA-Z0-9\-\ \,]+\ [0-9]{5}\-[A-Z][AZa-z\ \-]+$ Validator.NameDescProd=^[A-Za-z0-9.,-_ @#%&=?!]+$

Una vez que estos ficheros han quedado correctamente configurados pasaremos ha explicar como han de usarse dentro de nuestra aplicacin. Veamos por ejemplo un mtodo para validar un nombre usando la expresin regular que hicimos para validar un nombre. He dejado comentados cada uno de los argumentos necesarios y tambin se encuentra disponible el javadoc en la pgina de los repositorios del proyecto o en el paquete descargado; por ejemplo puede existir un argumento ms para que la cadena de caracteres se pase a forma cannica antes de ser validada. Java
public static String validateName Validator validador = ESAPI.v //Nombre a referirse, entrada return validador.getValidInput

public static String validateName(String input) throws IntrusionException, 1 ValidationException { 2 3 4 5 } El mtodo devuelve la cadena validada y en caso de error hay dos tipos de excepciones, ValidationException es lanzada cuando simplemente no se ha pasado la validacin, mientras que IntrusionException se lanza cuando se cree de manera muy clara que ha ocurrido un intento de ataque. El primer argumento es un nombre para nuestro uso personal que posteriormente lo usar si hay un error para indicar donde ha ocurrido. Y el nombre de la expresin regular ha de ser el mismo que dimos en el fichero de propiedades, de esta manera se elige con que expresin regular se desea validar una entrada.
Facilitador: Ing. Luis Vargas L. 89

Validator validador = ESAPI.validator(); //Nombre a referirse, entrada, nombre de la expresin regular, mxima longitud, permitir nulo o no return validador.getValidInput("Nombre", input, "Name", 100, false);

Como dije no hace falta crear expresiones regulares para los nmeros puesto que usan validaciones a parte. Veamos un ejemplo. Java
public static int validateNumber( Validator validador = ESAPI.v //Nombe para referirse, entra return validador.getValidInteg

1 2 3 4 5

public static int validateNumber(String input) throws IntrusionException, ValidationException { Validator validador = ESAPI.validator(); //Nombe para referirse, entrada, mnimo, mximo, permitir nulo o no return validador.getValidInteger("Entero", input, 0, 999999, false); }

Como se puede ver en el ejemplo validar un nmero es tremendamente sencillo sin tener siquiera la necesidad de especificar una expresin regular para la validacin de los mismos. Ahora veremos un ejemplo de como usar estas validaciones dentro de nuestra aplicacin. Java
try { String name = Tools.validateN } catch (IntrusionException ex) request.setAttribute("resultad

1 try { 2 String name = Tools.validateName(request.getParameter("name"));

3 } catch (IntrusionException ex) { 4 5 request.setAttribute("resultados", "Detectada una intrusin"); Tools.anadirMensaje(request, ex.getUserMessage());

6 } catch (ValidationException ex) { 7 request.setAttribute("resultados", "Error en el formulario");

Facilitador: Ing. Luis Vargas L.

90

8 9}

Tools.anadirMensaje(request, ex.getUserMessage());

Escapar las entradas de usuario ESAPI tambin nos permitir escapar las entradas del usuario para introducirlas en la base de datos; pero la verdad es que usando PreparedStatements este paso no sera necesario, y en caso de querer hacerlo habra que hacerlo despus de pasar la validacin por expresiones regulares puesto que al escapar una cadena se van a incluir nuevos caracteres como la contrabarra \. Veamos a continuacin un ejemplo sencillo para escapar las entradas preparado especialmente para MySQL (ESAPI proporciona mtodos de escape para MySQL y para Oracle si no recuerdo mal). Java
protected String scapeUserEntr Encoder encod = ESAPI.enco return encod.encodeForSQL( }

1 2 3 4

protected String scapeUserEntries (String input){ Encoder encod = ESAPI.encoder(); return encod.encodeForSQL(new MySQLCodec(MySQLCodec.MYSQL_MODE), input); }

Recomiendo que partiendo de los ejemplos y explicaciones que se han dejado aqu se eche un vistazo al javadoc de ESAPI puesto que contiene opciones bastante interesantes. Entre ellas tiene una forma de hacer validaciones seguidas poniendo los errores en una lista para hacer todo el conjunto de validaciones seguidas sin detenerse por el fallo de alguna de ellas. Cross Site Scripting (XSS) Ahora que hemos visto como evitar las inyecciones SQL veremos ahora las formas de evitar Cross Site Scripting, que a modo de resumen a lo que se coment en el captulo anterior se podra decir que el fin que se persigue con este tipo de ataques es introducir alguna informacin en la base de datos para que posteriormente sea mostrada a otros usuarios. La informacin que se suele introducir sern scripts que persiguen realizar alguna actividad ilegtima.

Facilitador: Ing. Luis Vargas L.

91

De la misma manera que en el apartado anterior se validaban las entradas de los usuarios para evitar la inyeccin SQL realizando esa validacin es evidente que se puede evitar tambin el XSS. Aunque el problema puede venir de un caso en el que no queramos usar una expresin regular para validar, por ejemplo un campo de comentarios para el usuario en el que se permite cualquier caracter. En este caso lo que habr que hacer es buscar etiquetas html sospechosas como script, pero realmente vale con buscar este tipo de etiquetas? Pues la respuesta es que no, porque si se usa otra codificacin ya no van a aparecer as las etiquetas. A continuacin veremos una buena forma de validar las entradas para evitar el XSS. El problema de las codificaciones Lo primero veamos el problema de las codificaciones. En el siguiente ejemplo ambas lneas son equivalentes. XHTML
<script>alert("Este sitio es un pe %3C%2Ftitle%3E%3Cscript%3E

1 2

<script>alert("Este sitio es un peligro");</script> %3C%2Ftitle%3E%3Cscript%3Ealert%28%22%A1Este+Sitio+es+un+peligro %21%22%29%3C%2Fscript%3E

Ahora si vemos que no se puede proteger simplemente buscando etiquetas html no?. Por lo tanto lo primero que habr que hacer es pasar la cadena a una forma cannica. Obtener la forma cannica de una cadena consiste en convertir toda la cadena a una codificacin conocida y admitida para que de esta manera se eviten problemas en la posterior validacin. Usando AntiSamy para validar entradas en HTML ESAPI tambin nos proporciona soluciones para todos los problemas comentados mediante un mdulo llamado AntiSamy. Este se encarga de procesar cdigo html y verificar si est permitido o por el contrario es un posible intento de intrusin, para ello usa un fichero xml de configuracin en el que se especificarn con detalle las etiquetas html permitidas y no permitidas; tambin ser posible especificar que tipo de propiedades de CSS se pueden usar. El archivo xml de configuracin de AntiSamy se puede colocar donde nosotros queramos, aunque, obviamente no sera una buena medida colocarlo en un directorio que sea accesible publicamente. En mi caso lo he colocado en el
Facilitador: Ing. Luis Vargas L. 92

mismo sitio que los archivos de configuracin de ESAPI, que si recordamos estaban en la carpeta setup que habamos aadido al classpath. En la pgina del proyecto de AntiSamy es posible encontrar varios archivos de configuracin de ejemplo, de ms a menos restrictivos. Lo mejor es partir de alguno de estos archivos y en caso de querer modificarlos hacerlo observando las directivas que ya contiene puesto que no es una tarea sencilla hacer un archivo de estos desde cero, por ello nos proporcionan varios ejemplos. Tambin hay un ejemplo en su pgina de descargas muy interesante pensado para enviar datos al servidor que provienen de un TextArea con TinyMCE (Librera JQuery para dotar a un TextArea de un editor con WYSIWYG). Ahora que hemos visto lo referente al fichero de configuracin ya estamos en disposicin de poner un ejemplo de un mtodo que valida una entrada HTML. Este mtodo que muestro a continuacin valida una entrada que se le pasa como argumento y lanza una IntrusionException si la validacin no ha pasado, dicha excepcin la he lanzado yo para detectar los errores puesto que la librera no lanza excepciones ante una validacin fallida, sino que anota los errores que han ocurrido y tambin tiene la posibilidad de eliminar aquello que no es vlido segn la configuracin que hayamos hecho en el fichero xml. Es importante ver tambin que como anoto en los comentarios antes de pasar la validacin se obtiene la forma cannica del String usando un mtodo que nos proporciona ESAPI. Y finalmente observar como se ha indicado donde esta el fichero xml de configuracin, que se ha realizado usando el classpath y obteniendo su flujo de entrada. Java
public static void validateHTML( try { //No se admite una entrada if (input.isEmpty() == true)

1 2 3 4 5 6 7 8

public static void validateHTML(String input) { try { //No se admite una entrada vaca if (input.isEmpty() == true) { throw new IntrusionException("No se admite el campo vaco", ""); } //Se obtiene el archivo de configuracin a travs del classpath Policy politica = Policy.getInstance(Tools.class.getResource("/antisamy-tinymce-1.4.4.xml"));
Facilitador: Ing. Luis Vargas L. 93

9 10 11 12 13 14 15 16

AntiSamy validator = new AntiSamy(); //Antes de analizar la cadena es convertida en su forma cannica //ESAPI.encoder().canonicalize(input) CleanResults cr = validator.scan(ESAPI.encoder().canonicalize(input), politica);

//Si ha ocurrido un error se lanza una excepcin indicando el error if (cr.getNumberOfErrors() != 0) {

throw new IntrusionException("Ha introducido cdigo HTML que no 17 est permitido", 18 19 20 21 } } catch (PolicyException ex) { cr.getErrorMessages().get(0).toString());

Logger.getLogger(Tools.class.getName()).log(Level.SEVERE, 22 ex.getMessage()); 23 24 } catch (ScanException ex) { Logger.getLogger(Tools.class.getName()).log(Level.SEVERE, ex.getMessage()); } }

Anexo Cerrar Conexiones, Statements y ResultSets. Varargs en java En este apartado vamos a ver una buena manera de hacer esos mtodos que decamos para cerrar las conexiones y Statments. Aqu el problema viene de hacer un mtodo que nos sirva para todos los mtodos de la clase manejadora de la base de datos. No van a tener todos los mtodos un Statement o un ResultSet, pueden tener varios de cada uno. Se puede pensar en hacer mtodos que reciban listas de Statements, pero estaramos a lo mejor escribiendo lneas construyendo esas listas en cada mtodo, lneas que se supone intentamos ahorrarnos. Pues bien java tiene algo llamado varargs para facilitarnos esta tarea, aunque internamente este construyendo listas el caso es que no tenemos que construirlas nosotros.
Facilitador: Ing. Luis Vargas L. 94

Lo nico que hemos de hacer es colocar en la cabecera de los mtodos de cierre unos puntos suspensivos detrs del tipo de dato. El argumento que vaya con varargs debe ser el ltimo y debe haber solo uno (esto es debido a que sino java no tiene forma de saber los tipos de datos de los argumentos). Posteriormente dentro del mtodo podemos recorrer los elementos con un bucle for-each, como si de un lista normal se tratara (que es de hecho lo que hace internamente como ya he dicho). Java
private void cerrarConexionYSt try { conexion.close(); } catch (SQLException ex) {

1 private void cerrarConexionYStatement(Connection conexion, Statement... statements) { 2 try { 3 conexion.close(); 4 } catch (SQLException ex) { 5 logger.log(Level.SEVERE, "Error al cerrar una conexin a la base de 6 datos", ex); 7 8 9 10 11 12 13 14 15 16 17 18 } } } } } } finally { for (Statement statement : statements) { if (statement != null) { try { statement.close(); } catch (SQLException ex) { logger.log(Level.SEVERE, "Error al cerrar un statement", ex);

Facilitador: Ing. Luis Vargas L.

95

19 20 private void cerrarResultSet(ResultSet... results) { 21 22 23 24 25 26 27 28 29 } Estos mtodos podran admitir toda una serie de llamadas no dependiendo del nmero de Statement o ResultSet. Java
cerrarConexionYStatement(con cerrarConexionYStatement(con cerrarResultSet(rs);

for (ResultSet rs : results) { if (rs != null) { try { rs.close(); } catch (SQLException ex) { logger.log(Level.SEVERE, "Error al cerrar un resultset", ex); } } }

1 2 3 4 5

cerrarConexionYStatement(conexion, select); cerrarConexionYStatement(conexion, deleteHistorialCarros, deleteProdCarro);

cerrarResultSet(rs); cerrarResultSet(consultaDatosCarro, rs);

Como podemos suponer nos hemos ahorrado bastantes lneas en cada uno de los mtodos, ahora como mximo habr dos lneas en cada mtodo para cerrar los recursos independientemente del nmero de recursos que haya.

Facilitador: Ing. Luis Vargas L.

96

Facilitador: Ing. Luis Vargas L.

97

You might also like