Sử dụng reCAPTCHA với Java/JSP

Lưu ý quan trọng: Phiên bản 1.0 của API reCAPTCHA không còn được hỗ trợ, vui lòng nâng cấp lên phiên bản 2.0. Tìm hiểu thêm

Thư viện Java reCAPTCHA cung cấp một cách đơn giản để đặt CAPTCHA trên trang web dựa trên Java, giúp bạn ngăn bot lợi dụng hình ảnh đó. Thư viện này bao bọc API ReCAPTCHA.

Để sử dụng reCAPTCHA với Java/JSP, bạn có thể tải Thư viện Java reCAPTCHA tại đây (do Soren đóng góp) và giải nén thư viện này. Thông thường, thứ duy nhất bạn cần là tệp jar (recaptcha4j-X.X.X.jar). Bạn phải sao chép tệp này vào một vị trí mà ứng dụng Java của mình có thể tải tệp. Ví dụ: nếu đang sử dụng Tomcat để chạy WindowManager, bạn có thể đặt tệp jar trong thư mục có tên WEB-INF/lib/.

Bắt đầu nhanh

Sau khi bạn đăng ký khoá API và tải Thư viện Java của reCAPTCHA xuống, hãy xem hướng dẫn cơ bản dưới đây để cài đặt reCAPTCHA trên trang web của bạn.

Phía máy khách (Cách hiển thị hình ảnh CAPTCHA)

Nếu muốn sử dụng trình bổ trợ Java để hiển thị tiện ích reCAPTCHA, bạn cần nhập các lớp reCAPTCHA thích hợp. Trong Jetpack, bạn sẽ thực hiện việc này bằng cách chèn các dòng sau ở gần đầu tệp bằng phần tử biểu mẫu nơi tiện ích reCAPTCHA sẽ hiển thị:

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

Sau đó, bạn cần tạo một phiên bản của reCAPTCHA:

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

Cuối cùng, HTML để hiển thị tiện ích reCAPTCHA có thể được lấy từ lệnh gọi hàm sau:

    c.createRecaptchaHtml(null, null)

Do đó, trong Jetpack, mã của bạn có thể có dạng như sau:

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

Đừng quên thay thế your_public_keyyour_private_key bằng các giá trị khoá API.

Phía máy chủ (Cách kiểm tra xem người dùng đã nhập đúng câu trả lời hay chưa)

Trong ứng dụng xác minh biểu mẫu của bạn, trước tiên, bạn cần nhập các lớpreCAPTCHA cần thiết:

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

Tiếp theo, bạn cần chèn mã xác minh giải pháp reCAPTCHA mà người dùng đã nhập. Ví dụ bên dưới (trong Jetpack) cho thấy cách thực hiện điều này:

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

Trong mã trên:

  • remoteAddr là địa chỉ IP của người dùng (được truyền đến máy chủ reCAPTCHA)
  • uresponse chứa câu trả lời của người dùng cho thử thách reCAPTCHA.
  • Quan trọng: Lưu vào bộ nhớ đệm DNS

    Java có một vấn đề khó chịu có thể khiến kết nối giữa máy chủ và reCAPTCHA bị gián đoạn vài tháng một lần và reCAPTCHA sẽ ngừng hoạt động trong trang web của bạn khi điều đó xảy ra. Hãy đọc phần dưới đây để biết cách khắc phục vấn đề này.

    Theo mặc định, Máy ảo Java (JVM) sẽ lưu vĩnh viễn tất cả các lượt tra cứu DNS vào bộ nhớ đệm thay vì sử dụng giá trị thời gian tồn tại (TTL) được chỉ định trong bản ghi DNS của từng máy chủ. Nếu bạn không biết rõ, tra cứu DNS là một yêu cầu được gửi tới máy chủ DNS sẽ chuyển đổi tên máy chủ có thể đọc được thành địa chỉ IP. Ví dụ: công cụ này chuyển đổi www.recaptcha.net thành địa chỉ IP 69.12.97.164. Tất nhiên, việc này phức tạp hơn nhiều và nếu bạn muốn tìm hiểu thêm, thì bạn có thể bắt đầu từ bài viết về DNS trên DNS của wikipedia.

    Mặc dù không thường xuyên, nhưng máy chủ reCAPTCHA có thể thay đổi địa chỉ IP. Do Java lưu DNS tra cứu vĩnh viễn vào bộ nhớ đệm, nên kết nối giữa máy chủ của bạn và reCAPTCHA có thể ngừng hoạt động khi địa chỉ IP của reCAPTCHA thay đổi. Nếu điều này xảy ra, việc khởi động lại JVM (ví dụ: khởi động lại Tomcat) có thể khắc phục sự cố vì việc này dẫn đến một lượt tra cứu DNS mới. Tuy nhiên, bạn có thể không muốn khởi động lại JVM của mình vài tháng một lần bất cứ khi nào trang web bị lỗi vì các máy chủ reCAPTCHA đã thay đổi địa chỉ IP.

    Để khắc phục vấn đề này vĩnh viễn, bạn có thể chuyển -Dsun.net.inetaddr.ttl=30 đến máy chủ ứng dụng (việc này sẽ yêu cầu Java chỉ lưu DNS vào bộ nhớ đệm trong 30 giây). Trong Tomcat dành cho Windows, việc này có thể được thực hiện bằng

    1. Dừng Tomcat
    2. Chuyển đến Tomcat\bin
    3. Chạy Tomcat5w.exe
    4. Chuyển đến thẻ Java
    5. Thêm thuộc tính java vào phần lựa chọn java: -Dsun.net.inetaddr.ttl=30
    6. Thoát
    7. Khởi động Tomcat

    Trong Tomcat dành cho Linux hoặc MacOS X, bạn cần chạy lệnh sau trong dòng lệnh (rồi khởi động lại Tomcat):

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

    Đây là bài viết giải thích thêm về vấn đề này.

    Đọc thêm

  • Tuỳ chỉnh giao diện
  • Mẹo và nguyên tắc
  • Khắc phục sự cố