Integrando un captcha en un proyecto Java con Spring

Hoy me ha tocado implementar reCAPTCHA en el servidor con Spring. En el ejemplo incrustan el código Java directamente en el JSP, cosa que intento evitar por todos los medios, así que he creado un bean Captcha desde el que hacer uso de la librería.

Igual que hay días que Spring los fastidia completamente, hoy ha sido uno de esos días en que cada problema que he tenido lo he solucionado mágicamente con el framework.

El primero:

Usamos el archivo captcha.properties para almacenar la clave privada y la pública. Este archivo no lo añadimos al control de versiones y así evitamos que las claves viajen por donde no tienen que viajar.

Diagrama para incrustar un captcha en un proyecto con Spring

El bean Captcha recibe estas claves en el constructor para que se vea claramente qué necesita para funcionar. El problema fue cómo pasar las claves desde el archivo de propiedades al constructor. Desde el applicationContext.xml ha sido muy fácil definiendo:

<bean class="org.springframework.beans.factory
   .config.PropertyPlaceholderConfigurer">
   <property name="location">
      <value>classpath:captcha.properties</value>
   </property>
</bean>

Y usando la propiedad que está dentro del archivo en cualquier parte del applicataionContext así:

${captcha.public}

Ahora, el problema de abrir un archivo de texto y extraer una propiedad de él es de Spring.

El segundo:

Desde un controlador, pasar a la vista JSP -del formulario- el código HTML para cargar el captcha. Por arte de magia todos los métodos con @RequestMapping pueden recibir un mapa de atributos, de manera que en el controlador se pueden añadir los atributos que se necesiten:

@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(ModelMap attributes) {
   attributes.addAttribute("captcha",
      captcha.getHtmlCaptcha());
   return "index";
}

En index.jsp, el código HTML dentro del atributo se incrusta así:

<c:out value="${captcha}" escapeXml="false" />

 

El tercero:

Al registrarse en reCAPTCHA, es necesario introducir la dirección del servidor. La misma que hay que enviar con cada intento de resolver el captcha. Pero ¿Cómo obtener la dirección remota desde un controlador en Spring? En esta ocasión también se puede añadir mágicamente a los métodos @RequestMapping el argumento HttpServletRequest request que ya se encarga de asignar internamente el framework y posteriormente se llama a

request.getRemoteAddr()

Ayer vi la primera parte de los vídeos que describen la cultura de los equipos de trabajo en Spotify. Me encantó el vídeo: Describe poco a poco cómo funcionan los equipos y justifican estas decisiones con su filosofía, que está muy inspirada en el manifiesto ágil.

Una de las muchas cosas que aprendí fue que prefieren integrar nuevas características en cuanto se desarrollan aunque las integren desactivadas. Así, detectan cuanto antes fallos de integración.

Mi manera de integrar el captcha desactivado ha sido incluir una propiedad enabled en el archivo captcha.properties pero estoy seguro de que hay una forma mejor: Una infraestructura para habilitar y deshabilitar desde un mismo lugar muchas de las características de la aplicación por diferentes que sean. ¿Cómo lo hacéis vosotros?

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s