Używanie reCAPTCHA z Javą/JSP

Ważne: interfejs API reCAPTCHA w wersji 1.0 nie jest już obsługiwany. Uaktualnij go do wersji 2.0. Więcej informacji

Biblioteka Java reCAPTCHA pozwala w prosty sposób umieścić obraz CAPTCHA w witrynie opartej na języku Java, co pomaga powstrzymać boty przed jego nadużywaniem. W bibliotece znajduje się interfejs reCAPTCHA API.

Aby używać reCAPTCHA w Javie/JSP, możesz pobrać tutaj bibliotekę JavareCAPTCHA (dostarczoną przez Sorena) i rozpakować ją. Potrzebny jest zwykle tylko plik jar (recaptcha4j-X.X.X.jar), który należy skopiować do miejsca, w którym może go załadować aplikacja Java. Jeśli na przykład do uruchamiania JSP używasz Tomcat, plik jar możesz umieścić w katalogu o nazwie WEB-INF/lib/.

Szybki start

Po zarejestrowaniu się w celu uzyskania kluczy interfejsu API i pobraniu biblioteki Java reCAPTCHA zapoznaj się z podstawowymi instrukcjami instalowania reCAPTCHA w swojej witrynie.

Po stronie klienta (jak wyświetlić obraz CAPTCHA)

Jeśli chcesz wyświetlić widżet reCAPTCHA za pomocą wtyczki Java, musisz zaimportować odpowiednie klasy reCAPTCHA. W JSP możesz to zrobić, wstawiając te wiersze blisko początku pliku z elementem formularza, w którym będzie wyświetlany widżet reCAPTCHA:

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

Następnie musisz utworzyć instancję reCAPTCHA:

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

Kod HTML wyświetlający widżet reCAPTCHA można uzyskać z tego wywołania funkcji:

    c.createRecaptchaHtml(null, null)

W JSP Twój kod może więc wyglądać mniej więcej tak:

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

Nie zapomnij zastąpić your_public_key i your_private_key wartościami klucza interfejsu API.

Po stronie serwera (jak sprawdzić, czy użytkownik wpisał poprawną odpowiedź)

W aplikacji, która weryfikuje formularz, najpierw musisz zaimportować niezbędne klasy reCAPTCHA:

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

Następnie musisz wstawić kod weryfikacyjny dla rozwiązania reCAPTCHA wpisanego przez użytkownika. Poniższy przykład (w języku JSP) pokazuje, jak to zrobić:

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

W tym kodzie:

  • remoteAddr to adres IP użytkownika (przekazywany do serwerów reCAPTCHA)
  • uresponse zawiera odpowiedź użytkownika na zadanie reCAPTCHA.
  • Ważne: buforowanie DNS

    W środowisku Java występuje irytujący problem, który może powodować przerwy w połączeniu między serwerem a reCAPTCHA co kilka miesięcy. W takim przypadku reCAPTCHA w Twojej witrynie przestaje działać. Poniżej dowiesz się, jak rozwiązać ten problem.

    Domyślnie maszyna wirtualna Java (JVM) zawsze zapisuje w pamięci podręcznej wszystkie wyszukiwania DNS na zawsze, zamiast używać wartości czasu życia danych (TTL), która jest określona w rekordzie DNS każdego hosta. Jeśli tego nie zrobisz, wyszukiwanie DNS to żądanie wysłane na serwer DNS, które konwertuje czytelną nazwę hosta na adres IP. Konwertuje na przykład www.recaptcha.net na adres IP 69.12.97.164. Jest to oczywiście znacznie bardziej złożone, a jeśli chcesz dowiedzieć się więcej, zajrzyj do artykułu Wikipedii o DNS.

    Serwery reCAPTCHA mogą zmieniać adresy IP choć niezbyt często. Ponieważ Java przechowuje wyszukiwania DNS w pamięci podręcznej w nieskończoność, może to spowodować przerwanie połączenia między serwerem a reCAPTCHA w przypadku zmiany adresu IP reCAPTCHA. Jeśli tak się stanie, ponowne uruchomienie JVM (np. ponowne uruchomienie serwera Tomcat) może rozwiązać problem, ponieważ powoduje to nowe wyszukiwanie DNS. Jednak prawdopodobnie nie chcesz ponownie uruchamiać JVM co kilka miesięcy po awarii witryny, ponieważ serwery reCAPTCHA zmieniły adres IP.

    Aby na stałe rozwiązać ten problem, możesz przekazać parametr -Dsun.net.inetaddr.ttl=30 do serwera aplikacji (pozwoli to Java buforować DNS tylko przez 30 sekund). W Tomcat dla Windows

    1. Zatrzymaj Tomcat
    2. Otwórz tomcat\bin
    3. Uruchom Tomcat5w.exe
    4. Przejdź do karty Java
    5. Dodaj właściwość Java do sekcji opcji Java: -Dsun.net.inetaddr.ttl=30
    6. Zakończ
    7. Uruchom Tomcat

    W systemie Tomcat for Linux lub MacOS X uruchom następujące polecenie z wiersza poleceń (a następnie ponownie uruchom Tomcat):

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

    Więcej informacji na ten temat znajdziesz w tym artykule.

    Dalsza lektura

  • Dostosowywanie wyglądu i stylu
  • Wskazówki i wytyczne
  • Rozwiązywanie problemów