Utiliser reCAPTCHA avec Java/JSP

Important: La version 1.0 de l'API reCAPTCHA n'est plus compatible. Veuillez passer à la version 2.0. En savoir plus

La bibliothèque Java reCAPTCHA offre un moyen simple de placer un CAPTCHA sur votre site Web Java, ce qui vous aide à empêcher les bots d'en abuser. La bibliothèque encapsule l'API reCAPTCHA.

Pour utiliser reCAPTCHA avec Java/JSP, vous pouvez télécharger la bibliothèque Java reCAPTCHA ici (fournie par Soren) et la décompresser. En règle générale, vous n'avez besoin que du fichier JAR (recaptcha4j-X.X.X.jar), que vous devez copier dans un emplacement où votre application Java pourra le charger. Par exemple, si vous utilisez Tomcat pour exécuter JSP, vous pouvez placer le fichier JAR dans un répertoire nommé WEB-INF/lib/.

Quick Start

Une fois que vous vous êtes inscrit pour obtenir vos clés API et que vous avez téléchargé la bibliothèque Java reCAPTCHA, vous trouverez ci-dessous des instructions de base pour installer reCAPTCHA sur votre site.

Côté client (comment faire apparaître l'image CAPTCHA)

Si vous souhaitez utiliser le plug-in Java pour afficher le widget reCAPTCHA, vous devez importer les classes reCAPTCHA appropriées. Pour ce faire, vous devez insérer les lignes suivantes dans la partie supérieure du fichier JSP avec l'élément de formulaire où le widget reCAPTCHA sera affiché:

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

Vous devez ensuite créer une instance de reCAPTCHA:

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

Enfin, le code HTML permettant d'afficher le widget reCAPTCHA peut être obtenu à partir de l'appel de fonction suivant:

    c.createRecaptchaHtml(null, null)

Votre code peut donc se présenter comme suit en page JSP:

    <%@ 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>

N'oubliez pas de remplacer your_public_key et your_private_key par les valeurs de vos clés API.

Côté serveur (comment vérifier si l'utilisateur a saisi la bonne réponse)

Dans l'application qui valide votre formulaire, vous devez d'abord importer les classes reCAPTCHA nécessaires:

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

Vous devez ensuite insérer le code qui valide la solution reCAPTCHA saisie par l'utilisateur. L'exemple ci-dessous (en page JSP) montre comment procéder:

    <%@ 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>

Dans le code ci-dessus :

  • remoteAddr est l'adresse IP de l'utilisateur (transmise aux serveurs reCAPTCHA).
  • uresponse contient la réponse de l'utilisateur au test reCAPTCHA.
  • Important: Mise en cache DNS

    Java rencontre un problème ennuyeux qui peut entraîner l'interruption de la connexion entre votre serveur et reCAPTCHA plusieurs fois par an, et reCAPTCHA cessera de fonctionner sur votre site lorsque cela se produira. Lisez la suite pour savoir comment résoudre ce problème.

    Par défaut, la machine virtuelle Java (JVM) met en cache toutes les résolutions DNS de façon permanente au lieu d'utiliser la valeur TTL (Time To Live) spécifiée dans l'enregistrement DNS de chaque hôte. Pour ceux d'entre vous qui ne le savent pas, une recherche DNS est une requête envoyée à un serveur DNS qui convertit un nom d'hôte lisible en adresse IP. Par exemple, il convertit www.recaptcha.net en adresse IP 69.12.97.164. C'est bien plus complexe que cela, et si vous souhaitez en savoir plus, l'entrée de Wikipédia sur le DNS est un bon point de départ.

    Bien que rarement, les serveurs reCAPTCHA peuvent modifier les adresses IP. Étant donné que Java met en cache les résolutions DNS de façon permanente, la connexion entre votre serveur et reCAPTCHA peut être interrompue lorsque l'adresse IP de reCAPTCHA change. Dans ce cas, vous pouvez résoudre le problème en redémarrant votre JVM (par exemple, Tomcat), car il entraîne une nouvelle résolution DNS. Cependant, il est préférable de ne pas redémarrer votre JVM tous les deux ou trois mois chaque fois que votre site tombe en panne, car les serveurs reCAPTCHA ont modifié l'adresse IP.

    Pour résoudre ce problème, vous pouvez transmettre -Dsun.net.inetaddr.ttl=30 à votre serveur d'applications (cela indique à Java de ne mettre en cache le DNS que pendant 30 secondes). Dans Tomcat pour Windows, cela peut être fait en

    1. Arrêter Tomcat
    2. Accéder à tomcat\bin
    3. Exécuter Tomcat5w.exe
    4. Accéder à l'onglet Java
    5. Ajout d'une propriété Java à la section des options Java: -Dsun.net.inetaddr.ttl=30
    6. Quitter
    7. Démarrer Tomcat

    Dans Tomcat pour Linux ou MacOS X, vous devez exécuter la commande suivante dans la ligne de commande, puis redémarrer Tomcat :

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

    Voici un article qui explique plus en détail ce problème.

    Documentation complémentaire

  • Personnalisation de l'apparence
  • Conseils et consignes
  • Dépannage