Utilizzo di reCAPTCHA con Java/JSP

Importante: la versione 1.0 dell'API reCAPTCHA non è più supportata, esegui l'upgrade alla versione 2.0. Scopri di più

La libreria Java di reCAPTCHA fornisce un modo semplice per inserire un CAPTCHA nel tuo sito web basato su Java, aiutandoti a impedire ai bot di utilizzarlo in modo illecito. La libreria racchiude l'API reCAPTCHA.

Per utilizzare reCAPTCHA con Java/JSP, puoi scaricare la libreria Java reCAPTCHA qui (collaborata da Soren) e decomprimerla. In genere l'unica cosa di cui hai bisogno è il file jar (recaptcha4j-X.X.X.jar), che devi copiare in una posizione in cui può essere caricato dall'applicazione Java. Ad esempio, se utilizzi Tomcat per eseguire JSP, puoi inserire il file jar in una directory denominata WEB-INF/lib/.

Avvio rapido

Dopo aver effettuato la registrazione per le chiavi API e scaricato la libreria Java di reCAPTCHA, di seguito puoi trovare le istruzioni di base per installare reCAPTCHA sul tuo sito.

Lato client (come visualizzare l'immagine del CAPTCHA)

Se vuoi utilizzare il plug-in Java per visualizzare il widget reCAPTCHA, devi importare le classi reCAPTCHA appropriate. In JSP, devi inserire queste righe nella parte superiore del file con l'elemento modulo in cui verrà visualizzato il widget reCAPTCHA:

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

Quindi, devi creare un'istanza di reCAPTCHA:

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

Infine, il codice HTML per visualizzare il widget reCAPTCHA può essere ottenuto dalla seguente chiamata a funzione:

    c.createRecaptchaHtml(null, null)

Quindi, in JSP il codice potrebbe avere il seguente aspetto:

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

Non dimenticare di sostituire your_public_key e your_private_key con le coppie chiave-valore API.

Lato server (come verificare se l'utente ha inserito la risposta corretta)

Nell'applicazione di verifica del modulo, devi prima importare le classi reCAPTCHA necessarie:

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

Successivamente, devi inserire il codice che verifica la soluzione reCAPTCHA inserita dall'utente. L'esempio seguente (in JSP) mostra come eseguire questa operazione:

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

Nel codice riportato sopra:

  • remoteAddr è l'indirizzo IP dell'utente (che viene passato ai server reCAPTCHA)
  • uresponse contiene la risposta dell'utente alla verifica reCAPTCHA.
  • Importante: memorizzazione nella cache DNS

    Java ha un problema fastidioso che potrebbe causare l'interruzione della connessione tra il tuo server e reCAPTCHA a intervalli di pochi mesi e reCAPTCHA smetterà di funzionare nel tuo sito quando ciò si verificherà. Continua a leggere per scoprire come risolvere il problema.

    Per impostazione predefinita, Java Virtual Machine (JVM) memorizza nella cache tutte le ricerche DNS in modo permanente invece di utilizzare il valore di durata (TTL) specificato nel record DNS di ciascun host. Per chi non lo sapete, una ricerca DNS è una richiesta inviata a un server DNS che converte un nome host leggibile in un indirizzo IP. Ad esempio, converte www.recaptcha.net nell'indirizzo IP 69.12.97.164. Ovviamente è molto più complesso e per saperne di più, la voce di Wikipedia sul DNS è un buon punto di partenza.

    Anche se non di frequente, i server reCAPTCHA possono cambiare gli indirizzi IP. Poiché Java memorizza nella cache le ricerche DNS in modo permanente, la connessione tra il server e reCAPTCHA può interrompersi quando l'indirizzo IP reCAPTCHA cambia. In questo caso, il riavvio della JVM (ad esempio il riavvio di Tomcat) può risolvere il problema perché causa una nuova ricerca DNS. Tuttavia, probabilmente non è consigliabile riavviare la JVM una volta ogni due mesi ogni volta che il tuo sito non funziona perché i server reCAPTCHA hanno cambiato l'indirizzo IP.

    Per risolvere definitivamente il problema, puoi passare -Dsun.net.inetaddr.ttl=30 al tuo app-server (in questo modo indichi a Java di memorizzare nella cache il DNS solo per 30 secondi). In Tomcat per Windows, puoi farlo

    1. Interrompi Tomcat
    2. Vai a tomcat\bin
    3. Esegui Tomcat5w.exe
    4. Vai alla scheda Java
    5. Aggiungi la proprietà Java alla sezione delle opzioni Java: -Dsun.net.inetaddr.ttl=30
    6. Esci
    7. Avvia Tomcat

    In Tomcat per Linux o MacOS X, devi eseguire il seguente comando nella riga di comando (quindi riavviare Tomcat):

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

    Ecco un articolo che fornisce maggiori informazioni su questo problema.

    Per approfondire

  • Personalizzazione di aspetto e design
  • Suggerimenti e linee guida
  • Risoluzione dei problemi