บทความนี้จะได้รับการอธิบายอย่างเต็มที่จากหน้าแผนกต้อนรับไปยังโต๊ะด้านหลัง ลองดูที่ด้านล่าง
1. รหัสเบื้องหน้า, image.jsp
<%@ page language = "java" contentType = "ข้อความ/html; charset = utf-8" pageencoding = "utf-8"%> <! doctype html สาธารณะ "-// w3c // dtd html 4.01 transitional // en" "http://www.w3.org/tr/html4/loose.dtd"><html><head> <meta http-equiv =" content-type "content =" text/html; charset = utf-8 " src = "$ {pageContext.request.contextpath}/static/js/jquery-1.10.2.min.js"> </script> </head> <body> <form action = "##" method = 'post'> id = "loginName" placeHolder = "ชื่อผู้ใช้" value = "" class = 'form-control'/> </div> </div> <div> <อินพุต type = "รหัสผ่าน" Autocomplete = "ปิด" id = "pwd" name = "pwd" onblur = "checkimg (this.value)" name = "validateCode" type = "text" placeholder = "ป้อนรหัสการตรวจสอบ"/> </div> <span> <img id = "codevalidateimg" onclick = "JavaScript: flushValidateCode (); > เปลี่ยนหนึ่ง </a> </p> </div> <div> <span> </span> </div> <div> <div> <อินพุต type = "ช่องทำเครื่องหมาย" name = "จำ" value = "1" class = 'icheck-me data-skin = "square-color =" blue " onclick = "JavaScript: submitForm ();" class = 'btn btn-primary'> </div> </form> <script type = "text/javascript"> $ (เอกสาร). พร้อม (ฟังก์ชั่น () {flushvalidateCode (); // การรีเฟรชและสร้างรหัสการตรวจสอบ}) document.getElementById ("codevalidateimg"); validateimgobject.src = "$ {pageContext.request.contextpath}/getSySmanagelogincode? เวลา =" + วันที่ใหม่ ();}/* ตรวจสอบว่ารหัสการตรวจสอบถูกป้อนอย่างถูกต้อง* "$ {pageContext.request.contextpath}/checkimageCode"; $ .get (url, {"validateCode": รหัส}, ฟังก์ชัน (ข้อมูล) {ถ้า (data == "ตกลง") {แจ้งเตือน ("ตกลง!")} else {แจ้งเตือน ("ข้อผิดพลาด!") flushvalidateCode ();}})2. รหัสพื้นหลัง ImageGenController.java
แพ็คเกจ com.dufyun.springmvc.web.controller; นำเข้า Javax.servlet.http.cookie; นำเข้า Javax.servlet.http.httpservletrequest นำเข้า javax.servlet.http.httpservletresponse; org.springframework.util.stringutils; นำเข้า org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.bind.annotation.responsebody; {@requestmapping (value = "/toimg") สตริงสาธารณะ toimg () {return "image/image"; } // เข้าสู่ระบบเพื่อรับรหัสการตรวจสอบ @RequestMapping ("/getSySmanageloginCode") @ResponseBody สตริงสาธารณะ GetSySmanageloginCode (httpservletResponse ตอบกลับ httpservletrequest คำขอ brows.setcontenttype ("image/jpeg" Response.Setheader ("Pragma", "No-cache"); // ตั้งค่าข้อมูลส่วนหัวตอบกลับเพื่อบอกเบราว์เซอร์ว่าอย่าแคชการตอบสนองเนื้อหานี้ setheader ("แคช-ควบคุม", "ไม่แคช"); Response.SetheAder ("Set-Cookie", "name = value; httponly"); // ตั้งค่าคุณสมบัติ httponly เพื่อป้องกันการโจมตี xs repandt.setDateHeader ("หมดอายุ", 0); RandomValidateCode RandomValidAtecode = new RandomValidAtEcode (); ลอง {randomValidateCode.getRandCode (คำขอ, การตอบสนอง, "imageCode"); // เมธอดอิมเมจเอาท์พุท} catch (Exception e) {E.printStackTrace (); } กลับ ""; } // การตรวจสอบรหัสการตรวจสอบ @requestmapping (value = "/checkimageCode") @ResponseBody สตริงสาธารณะ public ChectCode (HTTPSERVLETREQUEST Request, การตอบกลับ httpServletResponse) {string validateCode = request.getParameter ("validateCode"); รหัสสตริง = null; // 1: รับข้อมูลรหัสการตรวจสอบในคุกกี้คุกกี้ [] คุกกี้ = request.getCookies (); สำหรับ (คุกกี้คุกกี้: คุกกี้) {ถ้า ("imageCode" .equals (cookie.getName ())) {code = cookie.getValue (); หยุดพัก; }} // 1: รับข้อมูลของรหัสการตรวจสอบเซสชัน // สตริง code1 = (string) request.getSession (). getAttribute (""); // 2: พิจารณาว่ารหัสการตรวจสอบนั้นถูกต้องหรือไม่ถ้า (! stringUtils.isEmpty (ValidateCode) && validateCode.equals (รหัส)) {return "ตกลง"; } return "ข้อผิดพลาด"; // ฉันไม่ได้ทำการตรวจสอบการประมวลผลขนาดตัวอักษรที่คลุมเครือที่นี่ หากคุณสนใจคุณสามารถลองได้! -3. คลาสเครื่องมือสุ่ม ValidateCode.java เพื่อสร้างรหัสการตรวจสอบ
แพ็คเกจ com.dufy.javaweb.test; นำเข้า java.awt.color; นำเข้า java.awt.font; นำเข้า java.awt.graphics; นำเข้า java.awt.image.bufferedimage; นำเข้า Java.io.ByTearrayAtputStream javax.servlet.http.cookie; นำเข้า javax.servlet.http.httpservletrequest; นำเข้า Javax.servlet.http.httpservletResponse; สตริงส่วนตัว randstring = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // การสร้างแบบสุ่มสตริงความกว้าง int ส่วนตัว = 80; // ความกว้างของรูปภาพความสูง int ส่วนตัว = 26; // ความสูงของภาพส่วนตัว ตัวอักษร ("คงที่", font.center_baseline, 18); } /** รับสี* / สีส่วนตัว getRandColor (int fc, int bc) {ถ้า (fc> 255) fc = 255; ถ้า (BC> 255) BC = 255; int r = fc + random.nextint (BC - FC - 16); int g = fc + random.nextint (BC - FC - 14); int b = fc + random.nextint (BC - FC - 18); คืนสีใหม่ (R, G, B); } /** วาดสตริง* / การวาดสตริงส่วนตัว (กราฟิก G, สตริงแบบสุ่ม, int i) {g.setFont (getFont ()); G.SetColor (สีใหม่ (Random.nextint (101), Random.nextint (111), สุ่ม. nextint (121))); String rand = string.valueof (getRandomString (random.nextint (randstring.length ()))); RandomString += Rand; G.Translate (สุ่ม NEXTINT (3), RANDOM.NEXTINT (3)); G.DrawString (แรนด์, 13 * i, 16); ส่งคืนแบบสุ่ม; } /** วาดเส้นสัญญาณรบกวน* / โมฆะส่วนตัว Drawline (กราฟิก g) {int x = random.nextint (ความกว้าง); int y = random.nextint (ความสูง); int xl = random.nextint (13); int yl = random.nextint (15); G.Drawline (x, y, x + xl, y + yl); } /** รับอักขระสุ่ม* / สตริงสาธารณะ getRandomString (int num) {return string.valueof (randstring.charat (num)); } / *** สร้างภาพสุ่ม* / โมฆะสาธารณะ getRandCode (คำขอ httpservletrequest, การตอบสนอง httpservletResponse, คีย์สตริง) {// คลาส bufferedimage เป็นคลาสรูปภาพที่มีบัฟเฟอร์ กราฟิก g = image.getGraphics (); // สร้างวัตถุกราฟิกของวัตถุภาพ คุณสามารถดำเนินการวาดภาพต่าง ๆ บนภาพโดยการแก้ไขวัตถุ G.FillRect (0, 0, ความกว้าง, ความสูง); G.SetFont (ฟอนต์ใหม่ ("Times New Roman", Font.roman_baseline, 18)); G.SetColor (GetRandColor (110, 133)); // วาดเส้นสัญญาณรบกวนสำหรับ (int i = 0; i <= linesize; i ++) {drawline (g); } // วาดสตริงอักขระแบบสุ่มแบบสุ่ม = ""; สำหรับ (int i = 1; i <= stringnum; i ++) {randomstring = drawstring (g, randomstring, i); } // 1: ใส่รหัสการตรวจสอบที่สร้างขึ้นแบบสุ่มลงในคุกกี้คุกกี้คุกกี้ = คุกกี้ใหม่ (คีย์, สุ่ม); Response.addcookie (คุกกี้); // 2: ใส่รหัสการตรวจสอบที่สร้างขึ้นแบบสุ่มลงในสตริงเซสชัน sessionid = request.getSession (). getId (); request.getSession (). setAttribute (sessionId+คีย์, randomString); System.out.println ("************" + สุ่ม); // สรุป: ทั้งสองวิธีดี // (1): ใช้คุกกี้เพื่อส่งรหัสการตรวจสอบไปยังเบราว์เซอร์ด้านหน้าซึ่งไม่ปลอดภัย! ไม่แนะนำให้ใช้ // (2): การใช้วิธีการเซสชันสามารถแก้ปัญหาที่รหัสการตรวจสอบไม่ได้ส่งไปยังเบราว์เซอร์ซึ่งปลอดภัยกว่า แต่หากจำนวนผู้ใช้มีขนาดใหญ่เกินไปวิธีการจัดเก็บข้อมูลดังกล่าวจะสร้างแรงกดดันบนเซิร์ฟเวอร์และส่งผลกระทบต่อประสิทธิภาพของเซิร์ฟเวอร์ ไม่แนะนำให้ใช้ // วิธีนี้มีการใช้งานชั่วคราวที่นี่ วิธีที่ดีที่สุดคือการจัดเก็บรหัสการตรวจสอบที่สร้างขึ้นในแคชที่ใช้ในโครงการและตั้งค่าเวลาการทำให้เป็นโมฆะซึ่งไม่เพียง แต่สามารถรักษาความปลอดภัยได้ แต่ยังลดแรงกดดันบนเซิร์ฟเวอร์ G.Dispose (); ลอง {byteArrayOutputStream tmp = ใหม่ byteArrayOutputStream (); imageio.write (รูปภาพ, "png", tmp); tmp.close (); Integer ContentLength = tmp.size (); Response.SetheAder ("ความยาวเนื้อหา", contentLength + ""); Response.getOutputStream (). เขียน (tmp.tobyteArray ()); // เอาต์พุตภาพในหน่วยความจำไปยังไคลเอนต์ใน flow} catch (Exception e) {E.printStackTrace (); } ในที่สุด {ลอง {response.getOutputStream (). flush (); Response.getOutputStream (). Close (); } catch (Exception e2) {e2.printstacktrace (); - 4. สรุป
เนื้อหาของบทความนี้จบลงที่นี่ หากคุณไม่เข้าใจเนื้อหาภายในคุณสามารถฝากข้อความไว้เพื่อพูดคุย ฉันหวังว่าเนื้อหาของบทความนี้จะเป็นประโยชน์ต่อการศึกษาและการทำงานของทุกคน