Использование reCAPTCHA с Java/JSP

Важно : версия 1.0 API reCAPTCHA больше не поддерживается, обновите ее до версии 2.0. Узнать больше

Библиотека Java reCAPTCHA предоставляет простой способ разместить CAPTCHA на вашем веб-сайте на основе Java, помогая вам не дать ботам злоупотреблять ею. Библиотека является оберткой API reCAPTCHA .

Чтобы использовать reCAPTCHA с Java/JSP, вы можете скачать Java-библиотеку reCAPTCHA здесь (предоставлена ​​Soren) и разархивировать ее. Обычно единственное, что вам понадобится, — это файл jar (recaptcha4j-XXXjar), который вам нужно скопировать в место, где его сможет загрузить ваше Java-приложение. Например, если вы используете Tomcat для запуска JSP, вы можете поместить файл jar в каталог WEB-INF/lib/ .

Быстрый старт

После того как вы подписались на получение ключей API и загрузили Java-библиотеку reCAPTCHA, ниже приведены основные инструкции по установке reCAPTCHA на ваш сайт.

Клиентская часть (Как сделать так, чтобы изображение CAPTCHA отображалось)

Если вы хотите использовать плагин Java для отображения виджета reCAPTCHA, вам необходимо импортировать соответствующие классы reCAPTCHA. В JSP это можно сделать, вставив эти строки в верхнюю часть файла с элементом формы, где будет отображаться виджет reCAPTCHA:

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

Затем вам необходимо создать экземпляр reCAPTCHA:

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

Наконец, HTML-код для отображения виджета reCAPTCHA можно получить с помощью следующего вызова функции:

    c.createRecaptchaHtml(null, null)

Итак, в 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>

Не забудьте заменить your_public_key и your_private_key значениями ключей API.

Серверная часть (Как проверить, ввел ли пользователь правильный ответ)

В приложении, которое проверяет вашу форму, вам сначала необходимо импортировать необходимые классы reCAPTCHA:

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

Далее вам необходимо вставить код, который проверяет введенное пользователем решение reCAPTCHA. Пример ниже (в JSP) показывает, как это можно сделать:

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

В приведенном выше коде:

  • remoteAddr — IP-адрес пользователя (который передается серверам reCAPTCHA).
  • uresponse содержит ответ пользователя на запрос reCAPTCHA.
  • Важно: DNS-кэширование

    В Java есть досадная проблема, из-за которой соединение между вашим сервером и reCAPTCHA может прерываться каждые несколько месяцев, и когда это произойдет, reCAPTCHA перестанет работать на вашем сайте. Прочтите ниже, чтобы узнать, как это исправить.

    По умолчанию виртуальная машина Java (JVM) навсегда кэширует все запросы DNS вместо использования значения времени жизни (TTL), которое указано в записи DNS каждого хоста. Для тех из вас, кто этого не знает, поиск DNS — это запрос, отправляемый на DNS-сервер, который преобразует читаемое имя хоста в IP-адрес. Например, он преобразует www.recaptcha.net в IP-адрес 69.12.97.164 . Это, конечно, намного сложнее, и если вы хотите узнать больше, статья в Википедии о DNS является хорошей отправной точкой.

    Хотя и не часто, серверы reCAPTCHA могут менять IP-адреса. Поскольку Java кэширует DNS-запросы навсегда, это может привести к разрыву соединения между вашим сервером и reCAPTCHA при изменении IP-адреса reCAPTCHA. Если это произойдет, перезапуск JVM (например, перезапуск Tomcat) может решить проблему, поскольку вызывает новый поиск DNS. Однако вы, вероятно, не захотите перезапускать JVM раз в несколько месяцев, когда ваш сайт выходит из строя из-за того, что серверы reCAPTCHA меняют IP-адрес.

    Чтобы навсегда решить эту проблему, вы можете передать -Dsun.net.inetaddr.ttl=30 на свой сервер приложений (это сообщит Java кэшировать DNS только в течение 30 секунд). В Tomcat для Windows это можно сделать с помощью

    1. Остановить Томкэта
    2. Зайдите в tomcat\bin
    3. Запустите Tomcat5w.exe.
    4. Перейти на вкладку Java
    5. Добавьте свойство Java в раздел параметров Java: -Dsun.net.inetaddr.ttl=30
    6. Выход
    7. Запустить Томкэт

    В Tomcat для Linux или MacOS X вам необходимо запустить следующую команду в командной строке (а затем перезапустить Tomcat):

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

    Вот статья, объясняющая больше об этом вопросе.

    Дальнейшее чтение

  • Настройка внешнего вида
  • Советы и рекомендации
  • Поиск неисправностей