Captcha en Seam y ADF
Muchas veces, queremos que el usuario que se vaya a registrar en nuestra página, meta un código de validación, con el cual, protejamos nuestro sitio, de posibles ataques al mismo.
Una solución bastante efectiva es hacer uso de las librerías Captcha con la cual generabamos una imagen con un código que obligaba al usuario a introducirlo. En la nueva versión de JBoss Seam (1.1.6) esta librería viene integrada en el propio framework, permitiéndonos de una manera bastante sencilla integrarlo en nuestros proyectos.
En este tutorial vamos a explicar los pasos que tenemos que seguir para validar nuestros formularios con Captcha:
El funcionamiento de Captcha es un servlet, que nos genera la imagen con el código, y accediento al contexto de la página podemos sacar cuál es dicho código y validarlo. Por tanto, lo primero que debemos hacer, es definir el servlet en nuestro fichero de configuración web.xml:
<servlet>
<servlet-name>Captcha Servlet</servlet-name>
<servlet-class>
org.jboss.seam.servlet.CaptchaServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Captcha Servlet</servlet-name>
<url-pattern>/captcha</url-pattern>
</servlet-mapping>
La manera de mostrar la imagen y validarla la realizaremos a través del framework JBoss Seam, para ello, como es habitual, usaremos también el framework ADF en la capa de vista, que es donde se mostrará la imagen con el código y por donde a través de dicho framework accederemos al contexto donde Seam tiene referenciado al servlet.
En la página JSF-ADF donde tengamos el formulario debemos de definir un componente objectImage donde mostraremos la imagen generada por Captcha:
<af:objectImage source="/captcha?#{captcha.id}" />
Sólo quedaría definir un componente inputText donde el usuario pueda teclear el valor aparecido en la imagen, y así, validarlo:
<af:panelLabelAndMessage
label="Codigo de la imagen">
<af:inputText value="#{captcha.response}"
requiredMessageDetail=
"El valor debe coincidir con la imagen"
required="true" immediate="true">
<s:validate />
</af:inputText>
</af:panelLabelAndMessage>
Seam, internamente, y haciendo uso de las librerías de Captcha, capturará el valor de la caja de texto y lo validará con el código de la imagen, cuando nuestro usuario pulse el botón para confirmar el usuario. Esto se produce gracias al valor true de la propiedad required. El valor introducido se guarda en el metodo del objeto Captcha alojado en el contexto de Aplicación que genera Seam. Si no ha sido validada la imagen, dicho metodo no se ejecutará.
Tags: Java ServerFaces, JBoss Seam