خطوات توليد صورة رمز التحقق
إنشاء كائن bufferedimage.
احصل على فرشاة bufferedimage ، أي استدعاء طريقة getGraphics () للحصول على كائن الرسومات.
اتصل بالطريقة setColor () وطريقة FillRect () لكائن الرسومات لتعيين لون الخلفية للصورة.
اتصل بالطريقة setColor () وطريقة DrawLine () لكائن الرسومات لتعيين خط تداخل الصورة.
استدعاء طريقة setRGB () للكائن المخزن المؤقت لضبط ضجيج الصورة.
اتصل بالطريقة setColor () ، طريقة setFont () وطريقة dredstring () لكائن الرسومات لتعيين رمز التحقق من الصورة.
نظرًا لأنه يجب تحديد عرض وارتفاع صورة رمز التحقق وفقًا لأسلوب الموقع ، يجب تحديد حجم الخط وفقًا لعرض الصورة وارتفاعها ، ويتم استخدام مهارة صغيرة.
package util ؛ import java.awt.color ؛ استيراد java.awt.font ؛ استيراد java.awt.graphics ؛ استيراد java.awt.image ؛ import java.awt.image.bufferedImage ؛ import java.ebytearrayoutream ؛ import java.ioexception ؛ import java.random ؛ Javax.Imageio.Imageio ؛ التحقق من الفئة العامة {private Static Final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" ؛ / *** قم بإنشاء صورة بعرض كقسم ، والارتفاع كرمي ، ورمز التحقق كرمز* عرض عرض عرض الصورة* @param ارتفاع الصورة* param رمز التحقق } /** * قم بإنشاء عرض كعرض ، وارتفاع الارتفاع ، رمز التحقق هو رمز ، وعدد خطوط التداخل في الصورة هو linecnt * @param عرض عرض الصورة * @param ارتفاع الصورة * param code strenge * @param linecnt the the the the the the the the the the the the the te te to to to getImage الثابت العام (عرض int ، ارتفاع int ، رمز السلسلة ، int linecnt) {return createImage (العرض ، الارتفاع ، الكود ، linecnt ، 0.01) ؛ } /*** قم بإنشاء صورة ذات عرض ، وارتفاع ، وارتفاع ، ورمز التحقق هو رمز ، وعدد خطوط التداخل في الصورة هو linecnt* نسبة الضوضاء صاخبة ، أي أن النسبة المئوية لبيكسلات الضوضاء في الصورة* param interne internes inted the internate in the internate in the ederation in in in in in in in in in in in in in in in in in in. إنه بشكل مناسب وفقًا للنتائج* param ، يصرخ النسبة المئوية للبكسلات الضوضاء في الصورة إلى إجمالي وحدات البكسل* @RETURN إرجاع رمز التحقق من الصورة*/ public static static getImage (عرض int ، ارتفاع int ، رمز السلسلة ، int linecnt ، double noisere) } /** * * قم بإنشاء صورة بعرض وارتفاع ورمز التحقق. عدد خطوط التداخل في الصورة هو linecnt* نسبة الضوضاء صاخبة ، أي أن النسبة المئوية لبيكسلات الضوضاء في الصورة* param عرض ، فإن عرض الصورة* @بارام ، يرتفع ارتفاع الصورة* @pix pix pix in the param in the param in the param in the param in the param in the param the param the param in the param the param the param ther إلى إجمالي وحدات البكسل* RETURN إرجاع رمز التحقق من الصورة* / bufferedImage الثابتة الخاصة CreateImage (عرض int ، ارتفاع int ، رمز السلسلة ، int linecnt ، double noiserate) {int fontwidth = ((int) (width* 0.8)) / code.length () ؛ int fontheight = (int) (الارتفاع * 0.7) ؛ // من أجل إنشاء رموز التحقق الجيدة تحت أي عرض وارتفاع ، // حجم fontwdith هو أصغر في fontheight ، int fontsize = math.min (fontwidth ، fontheight) ؛ // int paddingx = (int) (العرض * 0.1) ؛ int paddingy = الارتفاع - (الارتفاع - fontsize) / 2 ؛ // إنشاء صورة bufferedImage buffimg = جديد bufferedImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ // GET Brush Graphics g = buffimg.getGraphics () ؛ // اضبط لون الفرشاة G.SetColor (GetRandColor (200 ، 255)) ؛ // ثم املأ مستطيل ، أي ، قم بتعيين لون الخلفية G.FillRect (0 ، 0 ، العرض ، الارتفاع) ؛ // قم بتعيين خط التداخل لـ (int i = 0 ؛ i <linecnt ؛ i ++) {// store للحصول على نقاط البدء والنهاية لخط التداخل int xs = (int) (math.random () * width) ؛ int ys = (int) (Math.Random () * الارتفاع) ؛ int xe = (int) (math.random () * width) ؛ int ye = (int) (Math.Random () * الارتفاع) ؛ G.SetColor (getRandColor (1 ، 255)) ؛ G.Drawline (XS ، YS ، XE ، ye) ؛ } // إضافة مساحة ضوضاء int = (int) (عرض * العرض * الارتفاع) ؛ لـ (int i = 0 ؛ i <area ؛ ++ i) {int x = (int) (math.random () * width) ؛ int y = (int) (Math.Random () * الارتفاع) ؛ buffimg.setrgb (x ، y ، (int) (math.random () * 255)) ؛ } // set font font font = new font ("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) ؛ } إرجاع Buffimg ؛ } / *** احصل على اللون العشوائي ، قيم R ، G ، B بين L و R* Param L الفاصل الأيسر* param r الفاصل الأيمن* @RETURN RESORD قيمة اللون العشوائي* / Private Static Color GetRandColor (int l ، int r) {if (l> 255) l = 255 ؛ if (r> 255) r = 255 ؛ إذا (l <0) l = 0 ؛ إذا (r <0) r = 0 ؛ int الفاصل الزمني = r - l ؛ int r = l + (int) (math.random () * interval) ؛ int g = l + (int) (math.random () * interval) ؛ int b = l + (int) (math.random () * interval) ؛ إرجاع اللون الجديد (R ، G ، B) ؛ } / *** قم بإنشاء عدة سلاسل بشكل عشوائي مكون من الأحرف الكبيرة والصغيرة والأرقام* param len يقوم بشكل عشوائي بإنشاء أحرف LEN* @RETURN إرجاع سلسلة تم إنشاؤها عشوائيًا تتكون من أحرف وأرقام صغيرة وأرقام صغيرة* / سلسلة ثابتة عامة getRandcode (int len) {string code = "" ؛ لـ (int i = 0 ؛ i <len ؛ ++ i) {int index = (int) (math.random () * alphabet.length ()) ؛ رمز = رمز + alphabet.charat (الفهرس) ؛ } رمز الإرجاع ؛ } / *** قم بتحويل الصورة إلى صفيف البايت* param صورة* return إرجاع مجموعة البايت* throws ioException* / public static byte [] getByTearray (صورة bufferedImage) يلقي ioException {bytearrayoutputstream baos = new bytearrayoutputtream () ؛ imageio.write (صورة ، "png" ، baos) ؛ إرجاع baos.tobytearray () ؛ // ByteArrayoutputStream لا يتطلب إغلاق}}}استخدم صورة رمز التحقق
في Servlet VerificationCode.java ، اتصل بالفئة أعلاه لإنشاء صورة رمز التحقق ، ثم أعد الصورة إلى العميل.
DOGED VOID DOGED (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {httpsession session = request.getSession () ؛ // قم بإنشاء سلسلة وخيوط جلسة بشكل عشوائي = Verification.getRandCode (4) ؛ Session.setAttribute ("التحقق" ، الكود) ؛ صورة BufferEdImage = util.Verifice.getImage (100،30 ، رمز ، 5) ؛ استجابة. outputStream Out = response.getOutputStream () ؛ out.write (util.Verification.getByTearray (Image)) ؛ out.flush () ؛ out.close () ؛ }اضبط رمز التحقق في index.jsp. عندما ينقر المستخدم على رمز التحقق ، يقوم باستدعاء رمز JS لطلب الخادم للحصول على رمز التحقق الجديد. نظرًا لأن المتصفح أعلاه ، سيتم تخزين رمز التحقق من قبل المتصفح ، فإن رمز JS يحتاج إلى إعطاء Servlet معلمة عشوائية ، بحيث يرسل المتصفح طلبًا إلى الخادم للحصول على رمز التحقق الجديد ، بدلاً من قراءته في ذاكرة التخزين المؤقت.
<٪@page import = "util.verification" ٪> <٪@page language = "java" contentType = "text/html ؛ charset = utf-8" pageencoding = "utf-8" ٪> <! doctype html public "-// w3c // dtd html 4.01 transitional // en" "http://www.w3.org/tr/html4/loose.dtd"><html><head> vighta http-equiv =" content-type "content =" text/html ؛ charset = utf-8 "> <title> أدخل العنوان هنا </title> document.getElementById ("التحقق"). } </script> </head> <body> <form action = "<٪ = request.getContextPath ()+"/checkverification "٪>" method = "post"> رمز التحقق: <input type = "text" name = "sultverification"> <img id = "verifical" src = <type type = "submit" name = "submit" value = "submit"> </form> </body> </html>أخيرًا ، في servlet checkverification.java ، نحدد ما إذا كان رمز التحقق الذي أدخله المستخدم صحيحًا. من أجل تسهيل المستخدمين ، يتم تعيين رمز التحقق عمومًا ليكون غير حساس للحالة ، لذلك يجب تحويله إلى أحرف صغيرة قبل المقارنة.
DOGED VOID DOGED (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servletexception ، ioException {httpsession session = request.getSession () ؛ سلسلة التحقق = (String) Session.getAttribute ("التحقق") ؛ سلسلة submitVerification = request.getParameter ("submitverification") ؛ printWriter out = response.getWriter () ؛ if (التحقق! = null && submitverification! = null) {if (ferification.toLowerCase (). equals (submitverification.toLowerCase ())) {out.println ("نعم !!!") ؛ } آخر {out.println ("لا !!!") ؛ }} آخر {out.println ("لا !!!") ؛ } session.removeattribute ("التحقق") ؛ // منع المستخدمين من إرسال النماذج بشكل متكرر}/** * see @httpservlet#dopost (httpservletrequest request ، httpservletsponse) الطريقة التي تم إنشاؤها تلقائيًا كعب الكعب (طلب ، استجابة) ؛ }العرض النهائي للتشغيل هو على النحو التالي
ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون مفيدًا لتعلم الجميع.