เครื่องมือ:
แพ็คเกจ com.lhy.web.servlet; นำเข้า java.awt.basicstroke; นำเข้า java.awt.color; นำเข้า java.awt.font; นำเข้า java.awt.graphics2d; นำเข้า Java.Awt.image.BufferedImage; java.io.ioException; นำเข้า java.io.OutputStream; นำเข้า java.util.random; นำเข้า Javax.imageio.imageio; Public Class VerifyCode {ส่วนตัว int w = 70; // ความยาวของภาพส่วนตัว int h = 35; // ความกว้างของรูปภาพ Font "," Chinese Kai Technique "," Bold Font "," Chinese New Wei "," Lishu จีน "," Microsoft Elegant Black "," Kai Technique_gb2312 "} สตริงส่วนตัว [] fontnames = {" Song Font "," Chinese Kai Technique "," Bold // รหัสยืนยันตัวเลือกอักขระตัวเลือกรหัสสตริงส่วนตัว = "23456789ABCDEFGHJKMNOPQRSTUVWXYZABCDEFGHJKMNPQRSTUVWXYZ"; // สีพื้นหลังสีส่วนตัว bgcolor = สีใหม่ (255, 255, 255); // ข้อความบนรหัสการตรวจสอบข้อความสตริงส่วนตัว; // สร้างสีแบบสุ่มสีส่วนตัวแบบสุ่ม () {int red = r.nextint (150); int green = r.nextint (150); int blue = r.nextint (150); คืนสีใหม่ (สีแดง, เขียว, สีน้ำเงิน); } // สร้างแบบอักษรฟอนต์แบบสุ่มแบบฟอนต์แบบสุ่ม () {int index = r.nextint (fontnames.length); String fontName = fontNames [index]; // สร้างชื่อตัวอักษรแบบสุ่ม Int Style = R.Neextint (4); // สร้างสไตล์การสุ่ม, 0 (ไม่มีสไตล์), 1 (ตัวหนา), 2 (ตัวเอียง), 3 (ตัวหนา + อิตาลี) ขนาด = r.nextint (5) + 24; // สร้างขนาดตัวอักษรแบบสุ่ม 24 ~ 28 ส่งคืนแบบอักษรใหม่ (FontName, Style, Size); } // วาดเส้นสัญญาณรบกวนเป็นโมฆะส่วนตัว Drawline (BufferedImage Image) {int num = 3; // วาด 3 graphics2d g2 = (graphics2d) image.getGraphics (); สำหรับ (int i = 0; i <num; i ++) {// สร้างพิกัดของสองจุดนั่นคือ 4 ค่า int x1 = r.nextint (w); int y1 = r.nextint (h); int x2 = r.nextint (w); int y2 = r.nextint (h); G2.SetStroke (basicstroke ใหม่ (1.5f)); g2.setColor (color.blue); // สายสัญญาณรบกวนคือ Blue G2.Drawline (x1, y1, x2, y2); // draw line}} // แบบสุ่มสร้างตัวละครส่วนตัวถ่านแบบสุ่ม () {int index = r.nextint (codes.length ()); รหัสส่งคืน Charat (ดัชนี); } // สร้าง bufferedImage private bufferedImage createImage () {// ความกว้างความสูงประเภทรูปภาพบัฟเฟอร์เมจภาพ = bufferedImage ใหม่ (w, h, bufferedimage.type_int_rgb); graphics2d g2 = (graphics2d) image.getGraphics (); g2.setColor (this.bgcolor); g2.fillrect (0, 0, w, h); ภาพกลับ; } // ส่งคืนข้อความบนรหัสการยืนยันภาพสตริงสาธารณะ getText () {return text; } // บันทึกภาพไปยังเอาท์พุทโมฆะแบบสแตติกส่งออกที่ระบุ (ภาพบัฟเดอร์เมจ, เอาท์พุทสตรีมออก) โยน ioexception {imageio.write (ภาพ "jpeg" ออก); } // โทรหาวิธีนี้เพื่อรับรหัสการตรวจสอบสาธารณะ bufferedImage getImage () {bufferedImage image = createImage (); // สร้างบัฟเฟอร์ภาพกราฟิก 2D g2 = (กราฟิก 2D) image.getGraphics (); 4; i ++) {// ลูปสี่ครั้งแต่ละครั้งจะสร้างสตริงอักขระหนึ่งตัว S = Randomchar ()+""; // สุ่มสร้างตัวอักษร sb.append (s); // เพิ่มตัวอักษรลงใน SB Float x = i * 1.0f * w /4; // ตั้งค่าพิกัดแกน x ของอักขระปัจจุบัน g2.setFont (randomfont ()); // ตั้งค่าตัวอักษรแบบสุ่ม G2.SetColor (randomColor ()); // ตั้งค่าสีแบบสุ่ม g2.drawstring (s, x, h-5); // วาดรูปภาพ} this.text = sb.toString (); // กำหนดสตริงที่สร้างขึ้นให้กับ this.text drawline (image); // เพิ่มอิมเมจการส่งสัญญาณสัญญาณรบกวน } โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น filenotfoundexception, ioexception {VerifyCode vc = new VerifyCode (); // สร้างวัตถุของคลาส VerifyCode bufferedImage bi = vc.getImage (); // call getImage () 3.jpg ")); // เรียกใช้เมธอดแบบสแตติกเมธอด () วิธีการบันทึกภาพในไฟล์สตรีมเอาท์พุทไฟล์ระบบ.VerifyCodeServlet:
แพ็คเกจ com.lhy.web.servlet; นำเข้า java.awt.image.bufferedimage; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; javax.servlet.http.httpservletResponse; คลาสสาธารณะ VerifyCodeServlet ขยาย httpservlet {โมฆะสาธารณะ doget (httpservletrequest คำขอ, httpservletResponse) การตอบสนองการตอบกลับ VC = ใหม่ VerifyCode (); BufferedImage image = vc.getImage (); request.getSession (). setAttribute ("session_vcode", vc.getText ()); // บันทึกข้อความบนภาพลงในฟิลด์ Session VerifyCode.output (image, response.getOutputStream ()); -เข้าสู่ระบบ:
แพ็คเกจ com.lhy.web.servlet; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.requestDispatcher; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.cookie; javax.servlet.http.htttservletrequest; นำเข้า Javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletresponse; นำเข้า Javax.servlet.http.https DOPOST (คำขอ HTTPSERVLETREQUEST, การตอบกลับ httpservletResponse) พ่น servletexception, ioexception { /** รหัสการตรวจสอบการตรวจสอบ* 1 รับรหัสการตรวจสอบที่ถูกต้องจากเซสชัน* 2 รับรหัสการตรวจสอบที่กรอกโดยผู้ใช้จากแบบฟอร์ม* 3 * 4. หากเหมือนกันเป็นจริงให้เรียกใช้มิฉะนั้นบันทึกข้อความแสดงข้อผิดพลาดไปยังโดเมนคำขอและส่งต่อไปยัง login.jsp */ string sessionCode = (String) request.getSession (). getAttribute ("session_vcode"); String paramCode = request.getParameter ("VerifyCode"); if (! paramCode.EqualSignorecase (SessionCode)) {request.setAttribute ("msg", "ข้อผิดพลาดรหัสการตรวจสอบ!"); request.getRequestDispatcher ("/login.jsp"). forward (คำขอ, การตอบกลับ); กลับ; } /** 1 รับข้อมูลแบบฟอร์ม* / // จัดการคำขอคำถามภาษาจีน Setcharacterencoding ("UTF-8"); // รับชื่อผู้ใช้สตริง = request.getParameter ("ชื่อผู้ใช้"); สตริงรหัสผ่าน = request.getParameter ("รหัสผ่าน"); /** 2. ตรวจสอบว่าชื่อผู้ใช้และรหัสผ่านนั้นถูกต้อง*/ถ้า ("itcast" .equalsignorecase (ชื่อผู้ใช้)) {// เข้าสู่ระบบได้สำเร็จ/** รายการเพิ่มเติม: บันทึกชื่อผู้ใช้ไปยังคุกกี้และส่งไปยังเบราว์เซอร์ไคลเอนต์ คุกกี้ ("uname", ชื่อผู้ใช้); // สร้างคุกกี้คุกกี้ SetMaxage (60* 60* 24); // ตั้งค่าชีวิตคุกกี้เป็น 1 วันตอบสนอง Addcookie (คุกกี้); // บันทึกคุกกี้/** 3 หากประสบความสำเร็จ session.setAttribute ("ชื่อผู้ใช้", ชื่อผู้ใช้); // บันทึกชื่อผู้ใช้ไปยังการตอบสนองของโดเมนเซสชัน SENDREDIRECT ("/test/succ1.jsp"); } else {// เข้าสู่ระบบล้มเหลว/** 4. หากล้มเหลว*> บันทึกข้อความแสดงข้อผิดพลาดเพื่อขอโดเมน*> ส่งต่อไปยัง login.jsp*/request.setAttribute ("msg", "ข้อผิดพลาดในชื่อผู้ใช้หรือรหัสผ่าน!"); requestDispatcher qr = request.getRequestDispatcher ("/login.jsp"); // get forwarder qr.forward (คำขอ, การตอบกลับ); // forward}}}}login.jsp:
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%String Path = request.getContextPath (); String basepath = request.getScheme ()+": //"+"getServerName ()+": " "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <base href = "<%= basepath%>" rel = "nofollow ภายนอก"> <title> jsp 'login.jsp' http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "Expires" content = "0"> <meta http-equiv = "คำหลัก" content = "keyword1, คำหลัก 2, คำหลัก type = "text/css" href = "styles.css" rel = "nofollow ภายนอก"> -> <script type = "text/javascript"> ฟังก์ชั่น _change () {/ * 1 รับองค์ประกอบ IMG 2. แก้ไข src */var imgele = document imgele.src = "<%= basepath%> servlet/verifycodeservlet? a =" + วันที่ใหม่ (). getTime ();} </script> </head> <body> <%-หน้านี้มีแบบฟอร์มการเข้าสู่ระบบ หากว่างเปล่าจะปรากฏขึ้น: "" ถ้าไม่ว่างเปล่ามันจะปรากฏขึ้น: ค่าของคุกกี้ */uname uname = ""; คุกกี้ [] cs = request.getCookies (); // รับคุกกี้ทั้งหมดในคำขอ (cs! = null) {// ถ้ามีคุกกี้ {// มองหาคุกกี้ชื่อ Uname Uname = C.getValue (); // รับค่าของคุกกี้นี้และให้ตัวแปร uname}}}}%> <% string message = ""; String msg = (string) request.getAttribute ("msg"); // รับแอตทริบิวต์ชื่อ MSG ในฟิลด์คำขอถ้า (msg! = null) {message = msg; }%> <font color = "red"> <b> <%= message%> </b> </font> <form action = "servlet/loginServlet" method = "post"> <%-แสดงชื่อผู้ใช้ในคุกกี้ไปยังกล่องข้อความชื่อผู้ใช้ name = "รหัสผ่าน"/> <br/> รหัสการตรวจสอบ: <อินพุตประเภท = "ข้อความ" ชื่อ = "VerifyCode" size = "3"/> <img id = "img" src = "<%= basepath%> servlet/verifycodeservlet"/> <a href = "javascript: value = "เข้าสู่ระบบ"/> </form> </body> </html>เข้าสู่ระบบ:
<body> <h1> succ1 </h1> <%string username = (string) session.getAttribute ("ชื่อผู้ใช้"); ถ้า (ชื่อผู้ใช้ == null) {/ * 1 บันทึกข้อความแสดงข้อผิดพลาดไปยังโดเมนคำขอ request.getRequestDispatcher ("/login.jsp"). forward (คำขอ, การตอบกลับ); return;}%> ยินดีต้อนรับต้อนรับอบอุ่นยินดีต้อนรับ <%=username %> ผู้นำเพื่อเป็นแนวทางในการทำงาน!
</body> </html>
ไฟล์กำหนดค่า:
<servlet> <servlet-name> loginservlet </servlet-name> <servlet-lass> com.lhy.web.servlet.loginservlet </servlet-lass> </servlet> <servlet-mapping> <servlet-mapping> <servlet-name> </servlet-mapping> <servlet> <servlet-name> VerifyCodeServlet </servlet-name> <servlet-lass> com.lhy.web.servlet.verifyCodeServlet </servlet-lass> </servlet> <servlet-mapping> <url-pattern>/servlet/verifycodeservlet </url-pattern> </servlet-mapping>
ข้อเสนอแนะ: เป็นการดีที่สุดที่จะตั้งค่า servlet ที่สร้างรหัสการตรวจสอบโดยไม่ต้องแคชเพื่อให้คุณไม่จำเป็นต้องเพิ่มการประทับเวลาเมื่อหน้าร้องขอภาพรหัสการยืนยัน การเพิ่มการประทับเวลาคือการหลอกเบราว์เซอร์เพื่อป้องกันไม่ให้เบราว์เซอร์อ่านรูปภาพรหัสการตรวจสอบในแคชและไม่มีการตอบสนองหลังจากคลิกเพื่อเปลี่ยน นี่ไม่ใช่สิ่งที่ดี ทุกครั้งที่ฉันคลิกเพื่อเปลี่ยนภาพอื่นเบราว์เซอร์จะแคชรูปภาพที่ได้รับใหม่ในพื้นที่ หากไม่ได้ถูกแคชใน servlet มันจะไม่แคชพวกเขาในพื้นที่
สรุป
ด้านบนเป็นรหัสตัวอย่างของเครื่องมือรหัสการตรวจสอบ Java ที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!