Cómo usar reCAPTCHA con Java/JSP

Importante: Ya no se admite la versión 1.0 de la API de reCAPTCHA. Actualiza a la versión 2.0. Más información

La biblioteca de reCAPTCHA para Java proporciona una forma sencilla de colocar un CAPTCHA en tu sitio web basado en Java, lo que ayuda a evitar que los bots lo abusen. La biblioteca une la API de reCAPTCHA.

Para usar reCAPTCHA con Java/JSP, puedes descargar la biblioteca de reCAPTCHA para Java aquí (aportada por Soren) y descomprimirla. Por lo general, lo único que necesitas es el archivo jar (recaptcha4j-X.X.X.jar), que debes copiar a un lugar donde se pueda cargar con tu aplicación de Java. Por ejemplo, si usas Tomcat para ejecutar JSP, puedes colocar el archivo jar en un directorio llamado WEB-INF/lib/.

Inicio rápido

Después de registrarte para obtener tus claves de API y descargar la biblioteca de reCAPTCHA para Java, encontrarás las siguientes instrucciones básicas para instalar reCAPTCHA en tu sitio.

Del cliente (cómo hacer que aparezca la imagen CAPTCHA)

Si deseas usar el complemento de Java para mostrar el widget de reCAPTCHA, deberás importar las clases de reCAPTCHA adecuadas. En JSP, para hacer esto, inserta estas líneas cerca de la parte superior del archivo con el elemento del formulario en el que se mostrará el widget de reCAPTCHA:

    <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
    <%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>

Luego, debes crear una instancia de reCAPTCHA:

    ReCaptcha c = ReCaptchaFactory.newReCaptcha("your_public_key", "your_private_key", false);

Por último, el código HTML para mostrar el widget de reCAPTCHA se puede obtener de la siguiente llamada a función:

    c.createRecaptchaHtml(null, null)

Por lo tanto, en JSP, tu código podría ser similar al siguiente:

    <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
    <%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>

    <html>
      <body>
        <form action="" method="post">
        <%
          ReCaptcha c = ReCaptchaFactory.newReCaptcha("your_public_key", "your_private_key", false);
          out.print(c.createRecaptchaHtml(null, null));
        %>
        <input type="submit" value="submit" />
        </form>
      </body>
    </html>

No olvides reemplazar your_public_key y your_private_key por los valores de tu clave de API.

En el servidor (cómo comprobar si el usuario ingresó la respuesta correcta)

En la aplicación que verifica tu formulario, primero deberás importar las clases de reCAPTCHA necesarias:

    import net.tanesha.recaptcha.ReCaptchaImpl;
    import net.tanesha.recaptcha.ReCaptchaResponse;

A continuación, debes insertar el código que verifica la solución de reCAPTCHA que ingresó el usuario. En el siguiente ejemplo (en JSP), se muestra cómo hacerlo:

    <%@ page import="net.tanesha.recaptcha.ReCaptchaImpl" %>
    <%@ page import="net.tanesha.recaptcha.ReCaptchaResponse" %>

    <html>
      <body>
      <%
        String remoteAddr = request.getRemoteAddr();
        ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
        reCaptcha.setPrivateKey("your_private_key");
String challenge = request.getParameter("recaptcha_challenge_field"); String uresponse = request.getParameter("recaptcha_response_field"); ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse); if (reCaptchaResponse.isValid()) { out.print("Answer was entered correctly!"); } else { out.print("Answer is wrong"); } %> </body> </html>

En el código anterior:

  • remoteAddr es la dirección IP del usuario (que se pasa a los servidores de reCAPTCHA).
  • uresponse contiene la respuesta del usuario al desafío de reCAPTCHA.
  • Importante: Almacenamiento en caché de DNS

    Java tiene un problema molesto que puede provocar que la conexión entre tu servidor y reCAPTCHA se interrumpa cada pocos meses, y reCAPTCHA dejará de funcionar en tu sitio cuando esto se produzca. Sigue leyendo para ver cómo solucionar este problema.

    De forma predeterminada, la máquina virtual Java (JVM) almacena en caché todas las búsquedas de DNS para siempre, en lugar de usar el valor de tiempo de actividad (TTL) que se especifica en el registro DNS de cada host. Para quienes no lo saben, una búsqueda de DNS es una solicitud enviada a un servidor DNS que convierte un nombre de host legible en una dirección IP. Por ejemplo, convierte www.recaptcha.net en la dirección IP 69.12.97.164. Por supuesto, es mucho más complejo que esto y, si quieres obtener más información, la entrada de Wikipedia sobre DNS es un buen punto de partida.

    Aunque no con frecuencia, los servidores de reCAPTCHA pueden cambiar las direcciones IP. Debido a que Java almacena en caché las búsquedas de DNS para siempre, esto puede provocar que falle la conexión entre tu servidor y reCAPTCHA cuando cambia la dirección IP de reCAPTCHA. Si esto sucede, reiniciar la JVM (p.ej., reiniciar Tomcat) puede solucionar el problema porque provoca una nueva búsqueda de DNS. Sin embargo, probablemente no quieras reiniciar tu JVM cada pocos meses cada vez que falle tu sitio, ya que los servidores de reCAPTCHA cambiaron la dirección IP.

    Para solucionar el problema, puedes pasar -Dsun.net.inetaddr.ttl=30 a tu servidor de apps (esto le indica a Java que solo almacene en caché el DNS durante 30 segundos). En Tomcat para Windows, esto se puede hacer

    1. Detener Tomcat
    2. Ir a tomcat\bin
    3. Ejecuta Tomcat5w.exe
    4. Ir a la pestaña de Java
    5. Agrega la propiedad Java a la sección de opciones de Java: -Dsun.net.inetaddr.ttl=30.
    6. Salir
    7. Iniciar Tomcat

    En Tomcat para Linux o MacOS X, debes ejecutar el siguiente comando en la línea de comandos (y, luego, reiniciar Tomcat):

        export JAVA_OPTS="$JAVA_OPTS -Dsun.net.inetaddr.ttl=30"
    

    Este es un artículo en el que se explica este problema.

    Material de lectura adicional

  • Cómo personalizar la apariencia
  • Sugerencias y lineamientos
  • Solución de problemas