ขั้นตอนการสร้างรหัสการตรวจสอบภาพ
สร้างวัตถุบัฟเฟอร์
รับแปรงของ bufferedImage นั่นคือเรียกใช้วิธี getGraphics () เพื่อรับวัตถุกราฟิก
เรียกเมธอด setColor () และวิธีการ fillrect () ของวัตถุกราฟิกเพื่อตั้งค่าสีพื้นหลังของภาพ
เรียกเมธอด setColor () และวิธี drawline () ของวัตถุกราฟิกเพื่อตั้งค่าบรรทัดสัญญาณรบกวนภาพ
เรียกใช้วิธีการ setRGB () ของวัตถุบัฟเฟอร์ทิเมทเพื่อตั้งค่าเสียงของภาพ
เรียกเมธอด setColor () เมธอด setFont () และวิธีการ drawstring () ของวัตถุกราฟิกเพื่อตั้งรหัสการตรวจสอบภาพ
เนื่องจากความกว้างและความสูงของภาพของรหัสการตรวจสอบจะต้องถูกกำหนดตามรูปแบบของเว็บไซต์ขนาดของตัวอักษรจะต้องถูกกำหนดตามความกว้างและความสูงของภาพและใช้ทักษะขนาดเล็ก
แพ็คเกจ util; นำเข้า java.awt.color; นำเข้า java.awt.font; นำเข้า java.awt.graphics; นำเข้า java.awt.image นำเข้า java.awt.image.bufferedimage; นำเข้า java.io.bytearrayoutputstream; javax.imageio.imageio; การตรวจสอบระดับสาธารณะ {ตัวอักษรสตริงสุดท้ายคงที่ส่วนตัว = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; / *** สร้างภาพที่มีความกว้างตามความกว้างความสูงเป็นความสูงและรหัสการตรวจสอบเป็นรหัส* @param ความกว้างความกว้างของภาพ* @param ความสูงความสูงของภาพ* @param รหัสการตรวจสอบรหัสสตริง* @return รหัสการตรวจสอบภาพ } /** * สร้างความกว้างตามความกว้างความสูงเป็นความสูงรหัสการตรวจสอบคือรหัสจำนวนเส้นสัญญาณรบกวนในภาพคือ linecnt * @param ความกว้างความกว้างของรูปภาพ * @param ความสูงความสูงของรูปภาพ * @param รหัสการตรวจสอบการใช้งาน รหัส*/ สาธารณะคงที่ bufferedImage getImage (ความกว้าง int, ความสูง int, รหัสสตริง, int linecnt) {return createimage (ความกว้าง, ความสูง, รหัส, linecnt, 0.01); } /*** สร้างภาพที่มีความกว้างความสูงความสูงและรหัสการตรวจสอบคือรหัสจำนวนเส้นสัญญาณรบกวนในภาพคือ linecnt* อัตราส่วนเสียงรบกวนนั้นมีเสียงดังนั่นคือเปอร์เซ็นต์ของพิกเซลเสียงรบกวนในภาพ* @param ความกว้างของความกว้างของภาพ อย่างเหมาะสมตามผลลัพธ์* @param ทำให้เกิดเปอร์เซ็นต์ของพิกเซลเสียงรบกวนในรูปภาพไปยังพิกเซลทั้งหมด* @return ส่งคืนรหัสการตรวจสอบภาพ*/ public bufferedimage getImage (ความกว้าง int, ความสูง int, รหัสสตริง, int linecnt, เสียงดังสองครั้ง) } /** * * สร้างภาพที่มีความกว้างความสูงและรหัสการตรวจสอบ จำนวนเส้นสัญญาณรบกวนในภาพคือ linecnt* อัตราส่วนเสียงรบกวนเป็นเสียงดังนั่นคือเปอร์เซ็นต์ของพิกเซลเสียงรบกวนในภาพ* @param ความกว้างความกว้างของภาพ* @param ความสูงความสูงของภาพการตรวจสอบรหัส* @param @param พิกเซล* @return ส่งคืนรหัสการตรวจสอบภาพ* / ส่วนตัวแบบคงที่ bufferedImage createImage (ความกว้าง int, ความสูง int, รหัสสตริง, int linecnt, เสียงดังสองครั้ง) {int fontwidth = (int) (ความกว้าง* 0.8)) / code.length (); int fontheight = (int) (ความสูง * 0.7); // เพื่อสร้างรหัสการตรวจสอบที่ดีภายใต้ความกว้างและความสูงใด ๆ // ขนาดของตัวอักษรนั้นมีขนาดเล็กลงใน fontheight, int fontsize = math.min (fontwidth, fontheight); // int paddingx = (int) (ความกว้าง * 0.1); int paddingy = ความสูง - (ความสูง - ตัวอักษร) / 2; // สร้างภาพบัฟเฟอร์เมจ buffimg = bufferedImage ใหม่ (ความกว้าง, ความสูง, bufferedImage.type_int_rgb); // รับแปรงกราฟิก g = buffimg.getGraphics (); // ตั้งค่าสีของแปรง G.SetColor (GetRandColor (200, 255)); // จากนั้นเติมสี่เหลี่ยมผืนผ้านั่นคือตั้งค่าสีพื้นหลัง g.fillrect (0, 0, ความกว้าง, ความสูง); // ตั้งค่าบรรทัดสัญญาณรบกวนสำหรับ (int i = 0; i <linecnt; i ++) {// เก็บเพื่อรับจุดเริ่มต้นและจุดสิ้นสุดของบรรทัดสัญญาณรบกวน int xs = (int) (math.random () * ความกว้าง); int ys = (int) (math.random () * ความสูง); int xe = (int) (math.random () * ความกว้าง); int ye = (int) (math.random () * ความสูง); G.SetColor (getRandColor (1, 255)); G.Drawline (xs, ys, xe, ye); } // เพิ่มเสียงรบกวนในพื้นที่ = (int) (เสียงดัง * ความกว้าง * ความสูง); สำหรับ (int i = 0; i <พื้นที่; ++ i) {int x = (int) (math.random () * ความกว้าง); int y = (int) (math.random () * ความสูง); buffimg.setrgb (x, y, (int) (math.random () * 255)); } // ตั้งค่าตัวอักษรตัวอักษร = ตัวอักษรใหม่ ("Ravie", Font.plain, FontSize); G.SetFont (แบบอักษร); สำหรับ (int i = 0; i <code.length (); ++ i) {string ch = code.substring (i, i+1); G.SetColor (GetRandColor (1, 199)); G.DrawString (CH, Paddingx + FontWidth * I, Paddingy); } return buffimg; } / *** รับสีแบบสุ่มค่าของ r, g, b อยู่ระหว่าง l และ r* @param l ช่วงเวลาซ้าย* @param r ช่วงเวลาที่ถูกต้อง* @return ส่งคืนค่าสีแบบสุ่ม* / สีคงที่ส่วนตัว getRandColor (int l, int r) {ถ้า (l> 255) l = 255; ถ้า (r> 255) r = 255; ถ้า (l <0) l = 0; ถ้า (r <0) r = 0; Int Interval = R - L; int r = l + (int) (math.random () * ช่วงเวลา); int g = l + (int) (math.random () * ช่วงเวลา); int b = l + (int) (math.random () * ช่วงเวลา); คืนสีใหม่ (R, G, B); } / *** สุ่มสร้างหลายสตริงที่ประกอบด้วยตัวพิมพ์ใหญ่และตัวพิมพ์เล็กและตัวพิมพ์เล็ก* @param len แบบสุ่มสร้างอักขระ LEN* @return ส่งคืนสตริงที่สร้างขึ้นแบบสุ่มซึ่งประกอบด้วยตัวพิมพ์ใหญ่และตัวพิมพ์เล็กและตัวพิมพ์เล็ก สำหรับ (int i = 0; i <len; ++ i) {int index = (int) (math.random () * alphabet.length ()); รหัส = รหัส + ตัวอักษร. Charat (ดัชนี); } รหัสส่งคืน; } / *** แปลงภาพเป็นอาร์เรย์ไบต์* @param image image* @return return byte array* @throws ioexception* / public static byte [] getByTearray (bufferedimage image) โยน ioexception imageio.write (รูปภาพ, "png", baos); กลับ baos.tobytearray (); // byteArrayOutputStream ไม่จำเป็นต้องปิด}}ใช้รูปภาพรหัสยืนยัน
ใน VerificationCode.java Servlet โทรไปที่คลาสข้างต้นเพื่อสร้างรูปภาพรหัสการตรวจสอบแล้วส่งคืนรูปภาพไปยังไคลเอนต์
Void Doget ที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {httpsession session = request.getSession (); // แบบสุ่มสร้างสตริงและเขียนรหัสเซสชันรหัส = Verification.getRandCode (4); session.setAttribute ("การตรวจสอบ", รหัส); BufferedImage image = util.Verific.getImage (100,30, รหัส, 5); Response.SetContentType ("Image/PNG"); outputStream out = response.getOutputStream (); out.write (util.Verific.getByTearray (รูปภาพ)); out.flush (); out.close (); -ตั้งค่ารหัสการตรวจสอบใน index.jsp เมื่อผู้ใช้คลิกรหัสยืนยันเขาเรียกรหัส JS เพื่อขอให้เซิร์ฟเวอร์รับรหัสการยืนยันใหม่ เนื่องจาก servlet ข้างต้นที่สร้างรหัสการตรวจสอบจะถูกแคชโดยเบราว์เซอร์รหัส JS จึงจำเป็นต้องให้พารามิเตอร์สุ่ม servlet เพื่อให้เบราว์เซอร์จะส่งคำขอไปยังเซิร์ฟเวอร์เพื่อรับรหัสการตรวจสอบใหม่แทนที่จะอ่านในแคช
<%@page import = "util.Verific"%> <%@page language = "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <! "http://www.w3.org/tr/html4/loose.dtd"><html><head> <meta http-equiv =" content-type "content =" text/html; charset = utf-8 " document.getElementById ("การตรวจสอบ"). src = "/VerificationCode/VerificationCode? hehe ="+math.random (); } </script> </head> <body> <form action = "< %= request.getContextPath ()+"/checkverification " %>" method = "post"> รหัสการตรวจสอบ: <อินพุต type = "text" name = "submentVerification"> <img id = "การตรวจสอบ") type = "ส่ง" name = "subment" value = "ส่ง"> </form> </body> </html>ในที่สุดในการตรวจสอบการเปลี่ยนรูป Servlet เราจะพิจารณาว่ารหัสการตรวจสอบที่ป้อนโดยผู้ใช้นั้นถูกต้องหรือไม่ เพื่ออำนวยความสะดวกให้ผู้ใช้รหัสการตรวจสอบโดยทั่วไปจะถูกตั้งค่าให้เป็นตัวพิมพ์ใหญ่กรณีดังนั้นจึงต้องแปลงเป็นตัวอักษรตัวเล็กก่อนการเปรียบเทียบ
Void Doget ที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {httpsession session = request.getSession (); การตรวจสอบสตริง = (สตริง) เซสชัน. getAttribute ("การตรวจสอบ"); String SubmentVerification = request.getParameter ("SubmentVerification"); PrintWriter out = response.getWriter (); if (การตรวจสอบ! = null && submentverification! = null) {ถ้า (Verification.toLowerCase (). Equals (SubmentVerification.ToLowerCase ())) {out.println ("ใช่ !!!"); } else {out.println ("ไม่ !!!"); }} else {out.println ("ไม่ !!!"); } session.removeattribute ("การตรวจสอบ"); // ป้องกันผู้ใช้จากการส่งแบบฟอร์มซ้ำ ๆ }/** * @See httpservlet#dopost (httpservletrequest Request, HttpservletResponse) วิธีการที่สร้างขึ้นอัตโนมัติ todo doget (คำขอ, การตอบกลับ); -การเรนเดอร์การวิ่งครั้งสุดท้ายมีดังนี้
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน