Jcaptcha มีพลังมาก ไม่เพียง แต่สามารถสร้างรหัสการตรวจสอบที่อิงกับภาพเท่านั้น แต่ยังรวมถึงรหัสการตรวจสอบด้วยเสียง (SINA ใช้รหัสการตรวจสอบสองเท่า) บทความนี้แนะนำตัวอย่างห้องสมุด JCAPTCHA และตัวอย่างการใช้งานสั้น ๆ ลองดูที่ด้านล่าง
ดาวน์โหลดไลบรารี jcaptcha
การพึ่งพา Maven ถูกเพิ่มเช่นนี้:
<การพึ่งพา> <loupId> com.octo.captcha </groupId> <ratifactid> jcaptcha </artifactid> <version> 1.0 </เวอร์ชัน> </dermentrency>
ห่อหุ้มคลาสง่าย ๆ
นำเข้า com.octo.captcha.component.image.backgroundgenerator.backgroundgenerator; นำเข้า com.octo.captcha.Component.image.backgroundGenerator.filereaderrandombackgroundGenerator; นำเข้า com.octo.captcha com.octo.captcha.component.image.fontgenerator.fontgenerator; นำเข้า com.octo.captcha.Component.image.fontgenerator.randomfontgenerator; นำเข้า com.octo.captcha.Component.Image.TextPaster.DecoratedRandomtext com.octo.captcha.component.image.textpaster.textpaster; image com.octo.captcha.component.image.textpaster.textDecorator.TextDecorator; image com.octo.captcha.Component.image.wordToImage.comportedToImage; com.octo.captcha.component.image.wordtoimage.image.wordtoimage; image com.octo.captcha.component.word.worderator.randomwordgenerator; นำเข้า com.octo.captcha.component.wordwordenerator.wordenerator; com.octo.captcha.engine.image.listimagecaptchaEngine; นำเข้า com.octo.captcha.image.gimpy.gimpyfactory; นำเข้า Java.awt.*;/***คลาสที่สร้างภาพการตรวจสอบความยาว MAX_WORD_LENGTH = 4; // ความยาวสูงสุดของรหัสการตรวจสอบรหัสส่วนตัวคงที่สุดท้าย IMAGE_HEIGHT = 30; // รหัสการตรวจสอบความสูงของภาพความสูงส่วนตัวคงที่จำนวนเต็มสุดท้าย IMAGE_WIDTH = 130; // รหัสการตรวจสอบความกว้างส่วนตัว การตรวจสอบรหัสส่วนตัวคงที่สตริงสุดท้ายแบบสุ่ม andword = "0123456789"; // อักขระสุ่ม // แบบอักษรแบบสุ่มสำหรับรหัสการตรวจสอบแบบฟอนต์สุดท้ายแบบคงที่ [] Random_font = Font ใหม่ [] {Font ใหม่ ("Nyala", Font.bold, min_font_size), New Font ( font.bold, min_font_size), ตัวอักษรใหม่ ("Credit Valley", Font.bold, min_font_size), ตัวอักษรใหม่ ("Impact", font.bold, min_font_size)}; // รหัสการตรวจสอบสีแบบสุ่มสีสุดท้ายสีสุดท้าย [] random_color = สีใหม่ [] {สีใหม่ (255, 255, 255), สีใหม่ (255, 220, 220), สีใหม่ (220, 255, 255), สีใหม่ (220, 220, 255), สีใหม่ (255 Private Static ListimagecaptchaEngine CaptchaEngine; สาธารณะ captchaEngine getCaptchaEngine (สตริงสุดท้าย imgPath) {ถ้า (captchaEngine == null) {ซิงโครไนซ์ (capchahelper.class) {ถ้า (captchaEngine == null && imgpath! = null) RandomListColorGenerator RandomListColorGenerator = new RandomListColorGenerator (Random_Color); BackgroundGenerator backgroundGenerator = ใหม่ filereaderrandombackgroundGenerator (image_width, image_height, imgpath); WordGenerator WordGenerator = ใหม่ randomWordGenerator (random_word); fontgenerator fontgenerator = new randomFontGenerator (min_font_size, max_font_size, random_font); TextDecorator [] textDecorator = new TextDecorator [] {}; TextPaster TextPaster = ใหม่ DecoratedRandomTextPaster (min_word_length, max_word_length, randomListColorGenerator, textDecorator); WordToImage wordtoimage = ใหม่ imposedWordToImage (fontgenerator, backgroundGenerator, textpaster); addFactory (ใหม่ gimpyfactory (WordGenerator, WordToImage)); - }}} ส่งคืน captchaEngine; -ตอบกลับคำขอรูปภาพรหัสที่ถูกต้องในหน้าเว็บ
คุณสามารถกำหนด servlet เพื่อตอบสนองต่อคำขอนี้ หากคุณใช้ springMVC คุณสามารถใช้วิธีการใน Controller เพื่อตอบสนองต่อคำขอนี้ ไม่ว่าในกรณีใดคุณจะต้องระบุวิธีการที่สอดคล้องกับ servlet或controller เช่นเส้นทางคือ :”/aaa/captcha”
จากนั้นใน เซิร์ฟเล็ตที่ตอบสนองต่อคำขอสำหรับเส้นทางนี้ คุณสามารถเขียนได้เช่นนี้:
// รับเส้นทางเพื่อรับภาพพื้นหลังของรหัสการตรวจสอบ เส้นทางนี้ทำให้รูปภาพจำนวนมากเป็นสตริงพื้นหลัง captcha_backgrounds = session.getServletContext (). getRealPath ("/web-inf/img/captcha"); CaptchaEngine CE = Capchahelper.getCaptchaEngine (Captcha_backgrounds); // รหัสการตรวจสอบปัจจุบันจะต้องได้รับจากเซิร์ฟเวอร์โดยใช้ JS ในหน้าเว็บผู้ดูแลระบบ captcha captcha = ce.getnextcaptcha (); // สำหรับการตรวจสอบให้ใส่วัตถุ CAPTCHA ลงในเซสชันเพื่อตรวจสอบว่าไคลเอ็นต์ส่งรหัสการตรวจสอบ req.getSession () SetAttribute ("captcha", captcha); // รับภาพรหัสการตรวจสอบนี่เป็นบิตแมปบัฟเฟดบัฟเดอร์ภาพที่ไม่มีการบีบอัดภาพ = (บัฟเดอร์เมจ) captcha.getchallenge (); resp.setContentType ("image/jpeg"); imageio.write (รูปภาพ, "jpg", resp.getoutputstream ());หากคุณใช้ SpringMVC เพียงแค่เขียนแบบนี้:
// รับเส้นทางเพื่อรับภาพพื้นหลังของรหัสการตรวจสอบ เส้นทางนี้ทำให้รูปภาพจำนวนมากเป็นสตริงพื้นหลัง captcha_backgrounds = session.getServletContext (). getRealPath ("/web-inf/img/captcha"); CaptchaEngine CE = Capchahelper.getCaptchaEngine (Captcha_backgrounds); // คุณต้องใช้ JS เพื่อรับรหัสการตรวจสอบปัจจุบันจากเซิร์ฟเวอร์ในหน้าเว็บผู้ดูแลระบบ captcha captcha = ce.getnextcaptcha (); // สำหรับการตรวจสอบให้ใส่วัตถุ CAPTCHA ลงในเซสชันเพื่อตรวจสอบเซสชัน SetAtTribute ("CAPTCHA"), CAPTCHA); // รับภาพรหัสการตรวจสอบนี่เป็นบิตแมปบัฟเฟดบัฟเดอร์ภาพที่ไม่มีการบีบอัดภาพ = (บัฟเดอร์เมจ) captcha.getchallenge (); ByTeArrayOutputStream BAO = ใหม่ byteArrayOutputStream (); // มันควรจะรวมเข้ากับ JPG และเขียนลงใน imageio.write imageiO.write (รูปภาพ, "jpg", bao); กลับ bao.tobytearray ();ในทั้งสองวิธีข้อมูลไบนารีที่ส่งคืนไปยังลูกค้า
String captcha_backgrounds = session.getServletContext().getRealPath(“/WEB-INF/img/captcha”);
เส้นทางต่อไปนี้ /WEB-INF/img/captcha ถูกวางด้วยรูปภาพหลายภาพเป็นพื้นหลังของภาพรหัสการตรวจสอบ มันจะต้องเป็น jpeg อาจไม่มีการ จำกัด ขนาดคุณสามารถลองด้วยตัวเอง
ใช้ <Img> เพื่อชี้ไปที่ที่อยู่นี้ในหน้าเว็บ
<img id = "captcha" src = " /captcha_img" onclick = "refreshcaptchaimg ()" />
ฟังก์ชัน JS refreshCaptchaImg() ตอบสนองต่อการคลิกของภาพ ทุกครั้งที่มีการคลิกภาพรหัสการตรวจสอบใหม่จะถูกเรียกคืน วิธีการแก้ไขภาพรหัสที่ถูกต้องอีกครั้ง?
เพียงเปลี่ยนแอตทริบิวต์ SRC ของ IMG แต่นี่คือการตั้งค่าแอตทริบิวต์นี้ด้วยที่อยู่เดียวกันทุกครั้งเพื่อไม่ให้เกิดการรีเฟรชจริงดังนั้นวิธี refreshCaptchaImg() จะถูกนำมาใช้เช่นนี้:
ฟังก์ชั่น refreshcaptchaimg () {// ภาพการตรวจสอบการโหลดซ้ำรูปภาพจากเซิร์ฟเวอร์ // เพิ่มพารามิเตอร์ไปยังสถานที่นี้อย่างหมดจดสำหรับการรีเฟรชที่ถูกบังคับมิฉะนั้นเบราว์เซอร์จะไม่รีเฟรชภาพจริง ๆ เนื่องจากที่อยู่ URL ชี้ไปที่ SRC ไม่ได้เปลี่ยนแปลงข้างต้นคือการแนะนำและการใช้ JCAPTCHA ซึ่งเป็นไลบรารีการสร้างรหัสการตรวจสอบใน Java ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้ Java