1. مقدمة
تتمثل ميزة استخدام رموز التحقق في صفحات النماذج في أنها تمنع المستخدمين بشكل فعال من إرسال النماذج بشكل ضار ، أو استخدام المكونات الإضافية لمهاجمة النظام بشكل غير قانوني.
2. ظروف التحضير
1. مشروع الويب العادي لمشروع الويب ؛
2. خادم الويب tomcat.
3. أفكار التنفيذ:
1. تخصيص servlet VerifyCodeservlet لرسم صورة رمز التحقق التي تحتوي على أحرف التحقق. تحتاج الصور هنا إلى رسمها يدويًا باستخدام Graphics2D ؛
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 * */ public class VerifyCodeservlet يمتد httpservlet {private static final long serialversionuid = -50510975288603895l ؛ /*** عرض صورة رمز التحقق. */ عرض int الخاص = 100 ؛ /*** ارتفاع صورة رمز التحقق. */ private int الارتفاع = 30 ؛ / *** عدد أحرف رمز التحقق*/ private Int CodeCount = 4 ؛ / *** ارتفاع الخط*/ الخاص int fontheight ؛ / *** قيمة المحور السيني للشخصية الأولى ، لأن إحداثيات الأحرف التالية يتم زيادة بالتسلسل ، فإن قيمة المحور X هي مضاعفة Codex*/ Private Int Codex ؛ / *** codey ، قيمة المحور ص لطبقة التحقق ، لأن القيم هي نفسها بسبب التوازي*/ private int codey ؛ / *** تمثل CodeSequence قيمة التسلسل التي يُسمح للأحرف بالظهور*/ char [] codeSequence = {'a' ، 'b' ، 'c' ، 'd' ، 'e' ، 'f' ، 'g' ، 'h' ، 'i ،' u '،' i ، '،' u '،' u '،' u '،' u '،' u '،' s ' 'v' ، 'w' ، 'x' ، 'y' ، 'z' ، '0' ، '1' ، '2' ، '3' ، '4' ، '5 ،' 6 '،' 7 '، 8' ، '9'} ؛ / *** تهيئة سمة صورة التحقق*/ public void init () يلقي servleTexception {// احصل على معلومات أولية من web.xml // width strwidth = this.getInitParameter ("width") ؛ // ارتفاع سلسلة strheight = this.getInitParameter ("الارتفاع") ؛ // عدد الأحرف StrcodEcount = this.getInitParameter ("CodeCount") ؛ // تحويل المعلومات التي تم تكوينها إلى تجربة عددية {if (strwidth! = null && strwidth.length ()! = 0) {width = integer.parseint (strwidth) ؛ } if (strheight! = null && strheight.length ()! = 0) {height = integer.parseint (strheight) ؛ } if (strcodeCount! = null && strcodeCount.length ()! = 0) {codeCount = integer.parseint (strcodeCount) ؛ }} catch (numberFormatexception e) {E.PrintStackTrace () ؛ } // WIDTH-4 قم بإزالة المواضع اليمنى واليسرى المتكررة لجعل رمز التحقق أكثر تركيزًا ، وكلما زادت تقليله ، زاد تركيزه. // CodeCount+1 // equi-variant التخصيص للعرض المعروض ، بما في ذلك المساحات الموجودة على الجانبين اليسرى واليمين Codex = (Width-4) /(CodeCount+1) ؛ // الارتفاع - 10 رمز التحقق مركزيا مركزي fontheight = الارتفاع - 10 ؛ CODEY = الارتفاع - 7 ؛ } / ** * request request * param استجابة * throws servleTexception * throws java.io.ioException * / خدمة void المحمية (طلب httpservletrequest ، httpservletponse) رمي servleTexception ، java.io.ioexception bufferedImage.type_int_rgb) ؛ graphics2d gd = buffimg.creategraphics () ؛ // إنشاء فئة من أرقام العشر عشوائي عشوائي = جديد عشوائي () ؛ // املأ الصورة باسم gd.setColor الأبيض (color.light_gray) ؛ gd.fillRect (0 ، 0 ، العرض ، الارتفاع) ؛ // إنشاء خط ، يجب تحديد حجم الخط وفقًا لارتفاع الصورة. font font = new font ("flexedsys" ، 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 (width) ؛ int y = random.nextint (الارتفاع) ؛ int xl = random.nextint (12) ؛ int yl = random.nextint (12) ؛ gd.drawline (x ، y ، x + xl ، y + yl) ؛ } // يتم استخدام RandomCode لحفظ رموز التحقق التي تم إنشاؤها عشوائيًا بحيث يمكن للمستخدم التحقق منها بعد تسجيل الدخول. StringBuffer RandomCode = جديد StringBuffer () ؛ int red = 0 ، الأخضر = 0 ، الأزرق = 0 ؛ // ينشئ بشكل عشوائي رمز التحقق لرقم codeCount. لـ (int i = 0 ؛ i <codeCount ؛ i ++) {// احصل على رقم رمز التحقق الذي تم إنشاؤه عشوائيًا. String strrand = string.valueof (codeesequence [random.nextint (36)]) ؛ // إنشاء مكونات ألوان عشوائية لإنشاء قيمة اللون ، بحيث تكون قيمة لون كل إخراج رقم مختلفة. أحمر = عشوائي. nextint (255) ؛ الأخضر = random.nextint (255) ؛ Blue = Random.NextInt (255) ؛ // ارسم رمز التحقق في الصورة باللون الذي تم إنشاؤه عشوائيًا. GD.SetColor (لون جديد (أحمر ، أخضر ، أزرق)) ؛ gd.drawString (strrrand ، (i + 1) * codex ، codey) ؛ // الجمع بين أربعة أرقام عشوائية معا. RandomCode.Append (Strrrand) ؛ } // حفظ رمز التحقق المكون من أربعة أرقام إلى الجلسة. جلسة httpsession = request.getSession () ؛ Session.setAttribute ("ValidateCode" ، RandomCode.ToString ()) ؛ // ذاكرة التخزين المؤقت الصورة محظورة. استجابة. استجابة. استجابة. استجابة. // إخراج الصورة إلى دفق إخراج servlet. servleToutPutStream SOS = response.getOutputStream () ؛ Imageio.write (Buffimg ، "JPEG" ، SOS) ؛ sos.close () ؛ }}ثم قم بتكوين هذا servlet الذي ينشئ رمز التحقق في web.xml ، على النحو التالي:
<Srevlet> <Sradlet-Name> VerifyCodeservlet </rectlet-name> <Servlet-class> com.servlet.verifycodeservlet </servlet-class> <Ing-param> <Iram-name> Width </param-name> <Param-value> 120 </ith-value> <Param-value> 32 </parm-value> </ith-param> <Ing-param> <Param-Name> CodeCount </param-name> <param-value> 4 </param-value> </ith-param> </isherled> <servlet-mapping> <Url-pattern>/verifyCodeservlet </url-pattern> </rectlet-mapping>
ابدأ الخادم وأدخل في شريط عنوان المتصفح: http: // localhost: 8080/WebProject/VerifyCodeservlet
تحقق من تأثير العرض ، على النحو التالي:
1. يتغير رمز التحقق في كل مرة تقوم فيها بتحديث رمز التحقق ، لأن Servlet قد تم تعيينه لتعطيل ذاكرة التخزين المؤقت للمتصفح.
2. تم العثور على مشكلة هنا: إذا كنت تستخدم متصفح Firefox ، فقد تم تنفيذ طريقة الخدمة المعاد كتابتها في VerifyCodeservlet مرتين ، وينطبق الشيء نفسه إذا قمت بإعادة كتابة طريقة DOGE أو طريقة DOPOST. وغيرها من المتصفحات لا ترى هذا الموقف. في وقت لاحق ، تم العثور على أنه إذا تمت الإشارة إلى Servlet من خلال الصفحة ، فسيكون من الطبيعي تسميتها.
ثم يمكنك الرجوع إلى رمز التحقق في الصفحة ، والرمز المحدد هو كما يلي:
<٪@ page language = "java" contentType = "text/html ؛ charset = utf-8" pageencoding = "utf-8" ٪> <! <html> <head> <meta http-equiv = "content-type" content = "text/html ؛ charset = iso-8859-1"> <title> insert title هنا </title> </head> <body> <div> <٪ string inputCode = request.getParameter ("inputcode") ؛ 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/> <input name = "إرسال" type = "إرسال" value = "إرسال"/> </form> </viv> <script> تحديث الوظيفة (obj) {obj.src = "verifycodeservlet؟" + Math.Random () ؛ } وظيفة mouseover (obj) {obj.style.cursor = "pointer" ؛ } </script> </body> </html> يقدم الرمز أعلاه رمز التحقق إلى JSP الحالي من خلال النموذج للتحقق مما إذا كان رمز التحقق الذي أدخله المستخدم صحيحًا. التأثير المحدد للعملية هو كما يلي:
1. أدخل رمز التحقق الصحيح
2. أدخل رمز التحقق الخاطئ