Como usar o reCAPTCHA com Java/JSP

Importante: não há mais suporte para a versão 1.0 da API reCAPTCHA. Faça upgrade para a versão 2.0. Saiba mais

A biblioteca reCAPTCHA Java oferece uma maneira simples de colocar um CAPTCHA em seu site baseado em Java, o que ajuda a impedir que bots abusem dele. A biblioteca encapsula a API reCAPTCHA.

Para usar o reCAPTCHA com Java/JSP, faça o download da biblioteca Java reCAPTCHA aqui (contribuído por Soren) e descompacte-a. Normalmente, você só precisa do arquivo jar (recaptcha4j-X.X.X.jar), que precisa ser copiado para um local onde ele possa ser carregado pelo aplicativo Java. Por exemplo, se você estiver usando o Tomcat para executar o Java, basta colocar o arquivo jar em um diretório chamado WEB-INF/lib/.

Início rápido

Depois de se inscrever para usar suas chaves de API e fazer o download da biblioteca Java do reCAPTCHA, confira abaixo as instruções básicas para instalar o reCAPTCHA no seu site.

Lado do cliente (como fazer a imagem do CAPTCHA aparecer)

Se você quiser usar o plug-in do Java para exibir o widget reCAPTCHA, será necessário importar as classes reCAPTCHA apropriadas. Na Java, isso é feito inserindo estas linhas próximas à parte superior do arquivo com o elemento de formulário em que o widget reCAPTCHA será exibido:

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

Em seguida, crie uma instância do reCAPTCHA:

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

Por fim, o HTML para exibir o widget reCAPTCHA pode ser recebido desta chamada de função:

    c.createRecaptchaHtml(null, null)

Assim, na Java, seu código pode ser parecido com este exemplo:

    <%@ 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ão se esqueça de substituir your_public_key e your_private_key pelos valores da chave de API.

Lado do servidor (como testar se o usuário inseriu a resposta certa)

No aplicativo que verifica seu formulário, primeiro é necessário importar as classes reCAPTCHA necessárias:

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

Em seguida, insira o código que verifica a solução reCAPTCHA inserida pelo usuário. O exemplo abaixo (em Java) mostra como isso pode ser feito:

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

No código acima:

  • remoteAddr é o endereço IP do usuário, transmitido para os servidores reCAPTCHA.
  • uresponse contém a resposta do usuário para o desafio reCAPTCHA.
  • Importante: armazenamento em cache de DNS

    O Java tem um problema irritante que pode fazer com que a conexão entre seu servidor e o reCAPTCHA seja interrompida em intervalos de alguns meses, e o reCAPTCHA vai parar de funcionar no seu site quando isso acontecer. Leia abaixo para saber como corrigir isso.

    Por padrão, a Java Virtual Machine (JVM) armazena em cache todas as pesquisas DNS para sempre, em vez de usar o valor de time to live (TTL) especificado no registro DNS de cada host. Para quem não sabe, uma busca DNS é uma solicitação enviada a um servidor DNS que converte um nome do host legível em um endereço IP. Por exemplo, ele converte www.recaptcha.net no endereço IP 69.12.97.164. Obviamente isso é muito mais complexo do que isso, e se você quiser saber mais, a entrada da Wikipédia sobre DNS é um bom ponto de partida.

    Embora isso não seja frequente, os servidores reCAPTCHA podem mudar endereços IP. Como o Java armazena as pesquisas DNS em cache para sempre, isso pode fazer com que a conexão entre seu servidor e o reCAPTCHA seja desativada quando o endereço IP do reCAPTCHA mudar. Se isso acontecer, reiniciar a JVM (por exemplo, reiniciar o Tomcat) pode corrigir o problema, porque causa uma nova busca DNS. No entanto, você provavelmente não quer reiniciar a JVM uma vez em intervalos de alguns meses sempre que o site falhar porque os servidores reCAPTCHA mudaram o endereço IP.

    Para corrigir esse problema definitivamente, você pode transmitir -Dsun.net.inetaddr.ttl=30 ao app-server. Isso informa ao Java para armazenar em cache apenas o DNS por 30 segundos. No Tomcat para Windows, isso pode ser feito

    1. Parar o Tomcat
    2. Ir para tomcat\bin
    3. Executar o Tomcat5w.exe
    4. Acessar a guia Java
    5. Adicionar propriedade Java à seção de opções Java: -Dsun.net.inetaddr.ttl=30
    6. Sair
    7. Inicie o Tomcat

    No Tomcat para Linux ou MacOS X, execute o seguinte comando na linha de comando e reinicie o Tomcat:

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

    Confira este artigo que explica esse problema.

    Leitura complementar

  • Como personalizar a aparência
  • Dicas e diretrizes
  • Solução de problemas