1. คำนำ
ข้อได้เปรียบของการใช้รหัสการตรวจสอบในหน้าแบบฟอร์มคือการป้องกันไม่ให้ผู้ใช้จากการส่งแบบฟอร์มที่เป็นอันตรายหรือใช้ปลั๊กอินเพื่อโจมตีระบบอย่างผิดกฎหมาย
2. เงื่อนไขการเตรียมการ
1. เว็บโปรเจ็กต์เว็บโครงการปกติ;
2. เว็บเซิร์ฟเวอร์ Tomcat
3. แนวคิดการใช้งาน:
1. ปรับแต่ง Servlet VerifyCodeServlet เพื่อวาดภาพรหัสการตรวจสอบที่มีอักขระการตรวจสอบ รูปภาพที่นี่จำเป็นต้องวาดด้วยตนเองโดยใช้กราฟิก 2D;
2. ใช้ SRC ของแท็ก IMG เพื่ออ้างอิง servlet นี้ในหน้าเฉพาะเพื่อแสดง servlet;
3. เนื่องจากข้อมูลรหัสการตรวจสอบถูกใส่ลงในเซสชันเมื่อวาดภาพหลังจากส่งแบบฟอร์มคุณสามารถเปรียบเทียบค่าที่บันทึกไว้ในเซสชันกับรหัสที่ป้อนโดยผู้ใช้เพื่อตรวจสอบว่าอินพุตถูกต้องหรือไม่
รหัสการตรวจสอบส่วนใหญ่ที่ใช้ผ่าน Servlets จะถูกนำไปใช้ทางออนไลน์และมีการป้อนตรรกะด้านล่าง:
ขั้นตอน:
1. แบบสุ่มสร้างสตริงรหัสการตรวจสอบเมื่อขอเข้าสู่ระบบไปยังหน้า;
2. เก็บสตริงรหัสตรวจสอบที่สร้างขึ้นในเซสชัน;
3. สร้างรูปภาพรหัสการตรวจสอบตามสตริงการตรวจสอบรหัสแล้วส่งออกรูปภาพรหัสการตรวจสอบไปยังลูกค้าเพื่อแสดง;
4. เปรียบเทียบสตริงการตรวจสอบรหัสที่ป้อนโดยผู้ใช้เมื่อส่งคำขอเข้าสู่ระบบด้วยสตริงในเซสชัน
4. รหัสเฉพาะมีดังนี้:
แพ็คเกจ com.servlet; นำเข้า Java.awt.Color; นำเข้า Java.awt.Font; นำเข้า java.awt.graphics2d; นำเข้า java.awt.image.bufferedimage; นำเข้า java.util.random; นำเข้า Javax.imageio.imageio; นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.servletOutputStream; นำเข้า Javax.servlet.http.httpservlet; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; นำเข้า Javax.servlet.http.httpsession; / ** * servlet ที่สร้างภาพรหัสการตรวจสอบภาพ * @author Administrator * */ คลาสสาธารณะ VerifyCodeServlet ขยาย HTTPSERVLET {ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = -505109752828603895L; /*** ความกว้างของภาพรหัสการยืนยัน */ ความกว้าง int ส่วนตัว = 100; /*** ความสูงของรูปภาพรหัสการตรวจสอบ */ ความสูง int ส่วนตัว = 30; / *** จำนวนอักขระการตรวจสอบรหัส*/ codecount int ส่วนตัว = 4; / *** ความสูงของตัวอักษร*/ int private int fontheight; / *** ค่า X-Axis ของอักขระตัวแรกเนื่องจากพิกัดของอักขระต่อไปนี้จะเพิ่มขึ้นตามลำดับค่า X-Axis ของพวกเขาคือ codex*/ private int codex; / *** codey ค่าแกน y ของอักขระการตรวจสอบเนื่องจากค่าเหมือนกันเนื่องจากคู่ขนาน*/ codey int ส่วนตัว; / *** codesequence แสดงถึงค่าลำดับที่ตัวละครได้รับอนุญาตให้ปรากฏ*/ char [] codesequence = {'a', 'b', 'c', 'd', 'e', 'f', 'g', ',', ',', ',', ',', ' 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; / *** เริ่มต้นแอตทริบิวต์ภาพการตรวจสอบ*/ โมฆะสาธารณะ init () พ่น servletexception {// รับข้อมูลเริ่มต้นจาก web.xml // ความกว้างสตริง strwidth = this.getInitParameter ("width"); // string string strheight = this.getInitParameter ("ความสูง"); // จำนวนอักขระสตริง strCodecount = this.getInitParameter ("codecount"); // แปลงข้อมูลที่กำหนดค่าเป็นลองตัวเลข {ถ้า (strwidth! = null && strwidth.length ()! = 0) {width = integer.parseint (strwidth); } if (strheight! = null && striight.length ()! = 0) {ความสูง = integer.parseint (striight); } if (strCodeCount! = null && strCodeCount.length ()! = 0) {codecount = integer.parseint (strCodeCount); }} catch (numberFormatexception e) {e.printStackTrace (); } // ความกว้าง -4 ถอดตำแหน่งซ้ายและขวาซ้ำซ้อนเพื่อให้รหัสการตรวจสอบเข้มข้นมากขึ้นและยิ่งคุณลดลงมากเท่าไหร่ก็ยิ่งเข้มข้นมากขึ้นเท่านั้น // codecount+1 // การจัดสรร Equi-variant ของความกว้างที่แสดงรวมถึงช่องว่างทางด้านซ้ายและด้านขวา codex = (width-4) /(codecount+1); // ความสูง - 10 รหัสการตรวจสอบการแสดงส่วนกลาง fontheight = ความสูง - 10; codey = ความสูง - 7; } / ** * @param Request * @param Response * @throws servletexception * @throws java.io.ioexception * / บริการ void ที่ได้รับการป้องกัน (คำขอ httpservletrequest, httpservletresponse การตอบสนอง) โยน servletexception, java.io.ioexception bufferedImage.type_int_rgb); graphics2d gd = buffimg.creategraphics (); // สร้างคลาสเครื่องกำเนิดตัวเลขแบบสุ่มสุ่มสุ่ม = new Random (); // เติมภาพเป็นสีขาว gd.setColor (color.light_gray); gd.fillrect (0, 0, ความกว้าง, ความสูง); // สร้างแบบอักษรขนาดของตัวอักษรควรถูกกำหนดตามความสูงของภาพ FONT FONT = FONT ใหม่ ("คงที่", font.plain, fontheight); // ตั้งค่าตัวอักษร gd.setFont (แบบอักษร); // วาดเส้นขอบ gd.setColor (color.black); gd.drawRect (0, 0, ความกว้าง - 1, ความสูง - 1); // แบบสุ่มสร้างบรรทัดสัญญาณรบกวน 160 เส้นทำให้รหัสการตรวจสอบสิทธิ์ในภาพมีโอกาสน้อยที่จะตรวจพบได้โดยโปรแกรมอื่น ๆ gd.setColor (color.gray); สำหรับ (int i = 0; i <16; i ++) {int x = random.nextint (ความกว้าง); int y = random.nextint (ความสูง); int xl = random.nextint (12); int yl = random.nextint (12); gd.drawline (x, y, x + xl, y + yl); } // แบบสุ่มใช้เพื่อบันทึกรหัสการตรวจสอบที่สร้างขึ้นแบบสุ่มเพื่อให้ผู้ใช้สามารถตรวจสอบหลังจากเข้าสู่ระบบ. StringBuffer randomCode = new StringBuffer (); int red = 0, green = 0, blue = 0; // แบบสุ่มสร้างรหัสการตรวจสอบสำหรับหมายเลข codecount สำหรับ (int i = 0; i <codecount; i ++) {// รับหมายเลขรหัสการตรวจสอบที่สร้างขึ้นแบบสุ่ม String strrand = string.valueof (codesequence [random.nextint (36)]); // สร้างส่วนประกอบสีแบบสุ่มเพื่อสร้างค่าสีเพื่อให้ค่าสีของเอาต์พุตแต่ละหลักจะแตกต่างกัน red = random.nextint (255); Green = Random.nextint (255); สีน้ำเงิน = random.nextint (255); // วาดรหัสการตรวจสอบลงในภาพด้วยสีที่สร้างแบบสุ่ม gd.setColor (สีใหม่ (สีแดง, เขียว, สีน้ำเงิน)); Gd.DrawString (Strrand, (i + 1) * codex, codey); // รวมตัวเลขสุ่มสี่ตัวที่สร้างเข้าด้วยกัน RandomCode.Append (Strrand); } // บันทึกรหัสการตรวจสอบสี่หลักในเซสชัน httpsession session = request.getSession (); Session.setAttribute ("ValidateCode", ubertCode.ToString ()); // ห้ามแคชรูปภาพ Response.Setheader ("Pragma", "No-cache"); Response.Setheader ("แคชควบคุม", "ไม่มีแคช"); Response.setDateHeader ("หมดอายุ", 0); Response.SetContentType ("Image/JPEG"); // เอาต์พุตภาพไปยังสตรีมเอาต์พุต servlet ServletOutputStream SOS = Response.getOutputStream (); Imageio.write (buffimg, "jpeg", sos); sos.close (); -จากนั้นกำหนดค่า servlet นี้ที่สร้างรหัสการตรวจสอบใน web.xml ดังต่อไปนี้:
<servlet> <servlet-name> VerifyCodeServlet </servlet-name> <servlet-lass> com.servlet.verifycodeservlet </servlet-class> <init-param> <param-name> width </param-name> <param-value> 32 </param-value> </init-param> <init-param> <param-name> codecount </param-name> <param-value> 4 </param-value> </init-param> </servlet> <servlet-mapping> <url-pattern>/VerifyCodeServlet </url-pattern> </servlet-mapping>
เริ่มเซิร์ฟเวอร์และป้อนในแถบที่อยู่เบราว์เซอร์: http: // localhost: 8080/webproject/verifycodeServlet
ตรวจสอบเอฟเฟกต์การแสดงผลดังนี้:
1. รหัสการยืนยันการเปลี่ยนแปลงทุกครั้งที่คุณรีเฟรชรหัสการตรวจสอบเนื่องจาก servlet ได้ตั้งค่าให้ปิดใช้งานแคชเบราว์เซอร์
2. พบปัญหาที่นี่: หากคุณใช้เบราว์เซอร์ Firefox วิธีการบริการที่เขียนใหม่ใน VerifyCodeServlet ได้ถูกดำเนินการสองครั้งและสิ่งนี้จะเป็นจริงหากคุณเขียนวิธี DEGET หรือวิธี DOPOST ใหม่ และเบราว์เซอร์อื่น ๆ ไม่เห็นสถานการณ์นี้ ต่อมาพบว่าหากมีการอ้างอิง servlet ผ่านหน้าเว็บมันจะเป็นเรื่องปกติที่จะเรียกมันว่า
จากนั้นคุณสามารถอ้างอิงรหัสการยืนยันบนหน้ารหัสเฉพาะมีดังนี้:
<%@ page language = "java" contentType = "ข้อความ/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd html 4.01 transitional // en" <html> <head> <meta http-equiv = "content-type" content = "text/html; charset = iso-8859-1"> <title> แทรกชื่อเรื่องที่นี่ </title> </head> <body> <div> String VerifyCode = (String) Session.getAttribute ("ValidateCode"); if (inputCode! = null && verifyCode! = null) {out.print ("รหัสการตรวจสอบจริง:" + VerifyCode + "<br/>" + "รหัสการตรวจสอบอินพุตผู้ใช้:" + inputCode + "<br/>"); inputCode = inputCode.touppercase (); // case insensitive out.print ("เปรียบเทียบรหัสการตรวจสอบเพื่อพิสูจน์อินพุตของผู้ใช้" + (inputcode.equals (VerifyCode)? "ถูกต้อง": "ข้อผิดพลาด") + "!"); } %> <form action = "index.jsp"> รหัสการตรวจสอบ: <input name = "inputCode" value = ""/> <img src = "VerifyCodeServlet" Align = "Middle" onClick = "JavaScript: Refresh (this);" onMouseOver = "mouseOver (this)"/> <br/> <ชื่ออินพุต = "ส่ง" type = "ส่ง" value = "ส่ง"/> </form> </div> </script> ฟังก์ชั่นรีเฟรชฟังก์ชั่น (obj) + math.random (); } ฟังก์ชั่น mouseOver (obj) {obj.style.cursor = "ตัวชี้"; } </script> </body> </html> รหัสข้างต้นส่งรหัสการยืนยันไปยัง JSP ปัจจุบันผ่านแบบฟอร์มเพื่อตรวจสอบว่ารหัสการตรวจสอบที่ป้อนโดยผู้ใช้นั้นถูกต้องหรือไม่ ผลเฉพาะของการดำเนินการมีดังนี้:
1. ป้อนรหัสการยืนยันที่ถูกต้อง
2. ป้อนรหัสการยืนยันที่ไม่ถูกต้อง