يبدو الرمز كما يلي:
import java.awt.Color;
import java.awt.Font;
استيراد java.awt.Graphics؛
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* <b>الوظيفة:</b> فئة أداة إنشاء رمز التحقق
* @projectNetWorkService
* @package com.hoo.util
* @ اسم الملف ValidCodeUtils.java
* @createDate2010-8-3 03:05:50 مساءً
*@authorhoojo
*/
@SuppressWarnings("غير مستخدم")
الطبقة العامة ValidCodeUtils {
/****************************************************** ***** *********************
* عرض رمز التحقق
*/
العرض العام الثابت = 60 ؛
/***
* ارتفاع رمز التحقق
*/
الارتفاع العام الثابت = 20؛
/********************************************************************************************************************************************************************* ***** *********************
* يجب أن يكون لون خلفية رمز التحقق COLOR_FC_BG أصغر من COLOR_BC_BG
*/
int العام الثابت COLOR_FC_BG = 200؛
/***
* يجب أن يكون لون خلفية رمز التحقق COLOR_FC_BG أصغر من COLOR_BC_BG
*/
int العام الثابت COLOR_BC_BG = 250؛
/****************************************************** ***** *********************
* يجب أن يكون لون خط تداخل خلفية رمز التحقق COLOR_FC_LINE أصغر من COLOR_BC_LINE
*/
int العام الثابت COLOR_FC_LINE = 160؛
/***
* يجب أن يكون لون خط تداخل خلفية رمز التحقق COLOR_FC_LINE أصغر من COLOR_BC_LINE
*/
int العام الثابت COLOR_BC_LINE = 200؛
/********************************************************************************************************************************************************************* ***** **************************
* يجب أن يكون لون رمز التحقق COLOR_FC_CODE أصغر من COLOR_BC_CODE
*/
int العام الثابت COLOR_FC_CODE = 20؛
/***
* يجب أن يكون لون رمز التحقق COLOR_FC_CODE أصغر من COLOR_BC_CODE
*/
int العام الثابت COLOR_BC_CODE = 170؛
/****************************************************** ***** **************************
* توليد الألوان ضمن النطاق المحدد
*قيمة اللون @param fc range fc أقل من 255
* @param bc range قيمة اللون قبل الميلاد أقل من 255
* @returnColor
*/
لون ثابت خاص getRandColor(int fc, int bc) {
عشوائي عشوائي = عشوائي جديد ()؛
إذا (FC <0)
نادي = 0;
إذا (قبل الميلاد <0)
قبل الميلاد = 1؛
إذا (FC > 255)
FC = 255؛
إذا (قبل الميلاد > 255)
قبل الميلاد = 255؛
إذا (قبل الميلاد == FC)
قبل الميلاد += 10;
درجة الحرارة المؤقتة = 0؛
إذا (قبل الميلاد <fc) {
درجة الحرارة = قبل الميلاد؛
قبل الميلاد = نادي؛
fc = درجة الحرارة;
}
int r = fc + Random.nextInt(bc - fc);
int g = fc + Random.nextInt(bc - fc);
int b = fc + Random.nextInt(bc - fc);
إرجاع لون جديد (r، g، b)؛
}
/**
* <b>الوظيفة:</b> إنشاء طريقة الصورة
* @createDate2010-8-3 03:06:22 مساءً
*@authorhoojo
*param طلب HttpServletRequest
* استجابةparam HttpServletResponse
* @return منطقية
* @throwsException
*/
getImage المنطقية العامة الثابتة (طلب HttpServletRequest، استجابة HttpServletResponse) يطرح الاستثناء {
Response.reset();
Response.setContentType("image/jpeg");
// قم بتعيين الصفحة بحيث لا يتم تخزينها مؤقتًا
Response.setHeader("Pragma", "No-cache");
Response.setHeader("التحكم في ذاكرة التخزين المؤقت"، "no-cache");
Response.setDateHeader("انتهاء الصلاحية"، 0);
// إنشاء صورة في الذاكرة
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// احصل على سياق الرسومات
الرسومات img = image.getGraphics();
// إنشاء فئة عشوائية
عشوائي عشوائي = عشوائي جديد ()؛
//تعيين لون الخلفية
img.setColor(getRandColor(COLOR_FC_BG, COLOR_BC_BG));
img.fillRect(0, 0, WIDTH, HEIGHT);
//تعيين الخط
img.setFont(new Font("Times New Roman", Font.PLAIN, 18));
// رسم الحدود
// g.setColor(new Color());
// g.drawRect(0,0,width-1,height-1);
// قم بإنشاء 155 خط تداخل بشكل عشوائي، مما يجعل من الصعب اكتشاف رمز المصادقة الموجود في الصورة بواسطة برامج أخرى
img.setColor(getRandColor(COLOR_FC_LINE, COLOR_BC_LINE));
لـ (int i = 0; i < 155; i++) {
int x = Random.nextInt(WIDTH);
int y = Random.nextInt(HEIGHT);
int xl = Random.nextInt(12);
int yl = Random.nextInt(12);
img.drawLine(x, y, x + xl, y + yl);
}
// احصل على رمز المصادقة الذي تم إنشاؤه عشوائيًا (4 أرقام)
قيمة كود السلسلة = ""؛
لـ (int i = 0; i < 4; i++) {
//String rand = String.valueOf(random.nextInt(10));
String rand = getRandomChar();
codeValue = codeValue.concat(rand);
img.setFont(getRandomFont());//خط عشوائي
// اعرض رمز المصادقة في الصورة
img.setColor(getRandColor(COLOR_FC_CODE, COLOR_BC_CODE));
img.drawString(rand, 13 * i + 6, 16);
}
request.getSession().setAttribute("codeValue", codeValue);
// الصورة نافذة المفعول
img.dispose();
// إخراج الصورة إلى الصفحة
return ImageIO.write(image, "JPEG",response.getOutputStream());
}
/**
* إنشاء أحرف بشكل عشوائي، بما في ذلك الأحرف الكبيرة والصغيرة والأرقام
* <b>الوظيفة:</b> الوظيفة
*@createDate2010-8-23 10:33:55 صباحًا
*@authorhoojo
* @يعود
*/
سلسلة ثابتة عامة getRandomChar() {
int Index = (int) Math.round(Math.random() * 2);
String randChar = "";
التبديل (الفهرس) {
الحالة 0: // الأحرف الكبيرة
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 65));
استراحة؛
الحالة 1: أحرف صغيرة
randChar = String.valueOf((char)Math.round(Math.random() * 25 + 97));
استراحة؛
الافتراضي: // الرقم
randChar = String.valueOf(Math.round(Math.random() * 9));
استراحة؛
}
إرجاع راندشار؛
}
/**
* <b>الوظيفة:</b> إنشاء الخطوط وأحجام النص بشكل عشوائي
* @ createDate 2010-8-23 10:44:22 صباحًا
*@authorhoojo
* @يعود
*/
الخط الثابت العام getRandomFont() {
String[] الخطوط = {"Georgia"، "Verdana"، "Arial"، "Tahoma"، "Time News Roman"، "Courier New"، "Arial Black"، "Quantzite"};
int FontIndex = (int)Math.round(Math.random() * (fonts.length - 1));
int FontSize = (int) Math.round(Math.random() * 4 + 16);
إرجاع خط جديد (fonts[fontIndex], Font.PLAIN, FontSize);
}
}
يتم تخزين قيمة رمز التحقق في الجلسة: request.getSession().setAttribute("codeValue", codeValue);
ما عليك سوى مقارنة القيمة التي أدخلها المستخدم وقيمة الكود في الجلسة لمعرفة ما إذا كانتا متساويتين؛
فيما يلي صفحة jsp التي تستدعي servlet: ValidCodeServlet.java
يتم استدعاء فئة أداة إنشاء رمز التحقق ValidCodeUtils أعلاه في ValidCodeServlet
الحزمة com.hoo.servlet؛
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.hoo.util.ValidCodeUtils;
@SuppressWarnings("المسلسل")
الطبقة العامة ValidCodeServlet تمتد HttpServlet {
doGet الفراغ العام (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
يحاول {
ValidCodeUtils.getImage(request, Response);
} قبض (الاستثناء ه) {
printStackTrace();
}
}
doPost باطلة عامة (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
doGet(request, Response);
}
}
فقط اتصل بطريقة servlet على صفحة jsp
js: طريقة reloadValidCode
إعادة تحميل الوظيفةValidCode(س) {
o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + new Date().getMillithans();
}
"timed = " + new Date().getMillithans() هنا مطلوب لمنع التخزين المؤقت لـ IE.
علامة HTML:
<img src="${pageContext.request.contextPath }/validCodeServlet" onclick="reloadValidCode(this)"/>
ما عليك سوى تكوين عنوان URL مباشرةً باستخدام اسم Servlet، والذي يتوافق مع تكوين web.xml. مسار الاستدعاء الرئيسي ${pageContext.request.contextPath}/validCodeServlet سيجلب الدليل الجذر، وهو أكثر أمانًا.
تكوين validCodeServlet في web.xml
<سيرفيليت>
<servlet-name>validCodeServlet</servlet-name>
<servlet-class>com.hoo.servlet.ValidCodeServlet</servlet-class>
</سيرفلت>
<رسم الخرائط servlet>
<servlet-name>validCodeServlet</servlet-name>
<url-pattern>/validCodeServlet</url-pattern>
</servlet-mapping>