การใช้ reCAPTCHA กับ Java/JSP

สำคัญ: ระบบไม่รองรับ reCAPTCHA API เวอร์ชัน 1.0 อีกต่อไปแล้ว โปรดอัปเกรดเป็นเวอร์ชัน 2.0 ดูข้อมูลเพิ่มเติม

ไลบรารี reCAPTCHA Java มอบวิธีง่ายๆ ในการวาง CAPTCHA ในเว็บไซต์ที่ใช้ Java ซึ่งจะช่วยป้องกันไม่ให้บ็อตใช้บ็อตอย่างไม่เหมาะสม ไลบรารีจะมี reCAPTCHA API รวมอยู่ด้วย

หากต้องการใช้ reCAPTCHA กับ Java/JSP คุณจะดาวน์โหลดไลบรารี JavaScript สำหรับ reCAPTCHA ที่นี่ (จัดทำโดย Soren) และแตกไฟล์ ZIP โดยทั่วไปแล้ว สิ่งเดียวที่คุณต้องมีคือไฟล์ jar (recaptcha4j-X.X.X.jar) ซึ่งคุณต้องคัดลอกไปยังตำแหน่งที่แอปพลิเคชัน 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 หยุดชะงักทุก 2-3 เดือน และ reCAPTCHA จะหยุดทำงานในเว็บไซต์เมื่อเกิดเหตุการณ์ดังกล่าวขึ้น อ่านวิธีแก้ไขปัญหานี้ด้านล่าง

    โดยค่าเริ่มต้น Java Virtual Machine (JVM) จะแคชการค้นหา DNS ทั้งหมดไว้ตลอดไปแทนที่จะใช้ค่า Time to Live (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 ทุก 2-3 เดือนเมื่อเว็บไซต์หยุดทำงานเนื่องจากเซิร์ฟเวอร์ reCAPTCHA เปลี่ยนที่อยู่ IP

    หากต้องการแก้ไขปัญหานี้ ให้ส่ง -Dsun.net.inetaddr.ttl=30 ไปยังเซิร์ฟเวอร์แอป (ซึ่งจะแจ้งให้ Java แคช DNS เป็นเวลา 30 วินาทีเท่านั้น) ใน Tomcat for Windows สามารถทำได้โดย

    1. หยุด Tomcat
    2. ไปที่ tomcat\bin
    3. เรียกใช้ Tomcat5w.exe
    4. ไปที่แท็บ Java
    5. เพิ่มพร็อพเพอร์ตี้ Java ไปยังส่วนตัวเลือก Java: -Dsun.net.inetaddr.ttl=30
    6. ออก
    7. เริ่มต้น Tomcat

    ใน Tomcat สำหรับ Linux หรือ MacOS X คุณต้องเรียกใช้คำสั่งต่อไปนี้ในบรรทัดคำสั่ง (แล้วรีสตาร์ท Tomcat):

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

    นี่คือบทความ ที่อธิบายเพิ่มเติมเกี่ยวกับปัญหานี้

    อ่านเพิ่มเติม

  • การปรับแต่งรูปลักษณ์และความรู้สึก
  • เคล็ดลับและหลักเกณฑ์
  • การแก้ปัญหา