รหัสมีลักษณะดังนี้:
นำเข้า java.awt.Color;
นำเข้า java.awt.Font;
นำเข้า java.awt.Graphics;
นำเข้า java.awt.image.BufferedImage;
นำเข้า java.util.สุ่ม;
นำเข้า javax.imageio.ImageIO;
นำเข้า javax.servlet.http.HttpServletRequest;
นำเข้า javax.servlet.http.HttpServletResponse;
-
* <b>ฟังก์ชั่น:</b> คลาสเครื่องมือสร้างรหัสยืนยัน
* @projectNetWorkService
* @package com.hoo.util
* @fileName ValidCodeUtils.java
* @createDate 2010-8-3 15:05:50 น
*@authorhoojo
-
@SuppressWarnings("ไม่ได้ใช้")
ValidCodeUtils ระดับสาธารณะ {
/************************************************* ***** *********************
* ความกว้างของรหัสยืนยัน
-
int สาธารณะคงที่ WIDTH = 60;
-
* ความสูงของรหัสยืนยัน
-
int สาธารณะคงที่ HEIGHT = 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 ค่าสี bc น้อยกว่า 255
* @returnColor
-
สีคงที่ส่วนตัว getRandColor (int fc, int bc) {
สุ่ม สุ่ม = สุ่มใหม่();
ถ้า (เอฟซี < 0)
เอฟซี = 0;
ถ้า (bc < 0)
พ.ศ. = 1;
ถ้า (เอฟซี > 255)
เอฟซี = 255;
ถ้า (bc > 255)
ก่อนคริสต์ศักราช = 255;
ถ้า (bc == เอฟซี)
ก่อนคริสต์ศักราช += 10;
อุณหภูมิภายใน = 0;
ถ้า (bc <fc) {
อุณหภูมิ = BC;
พ.ศ. = เอฟซี;
เอฟซี = อุณหภูมิ;
-
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> สร้างวิธีการสร้างภาพ
* @createDate 2010-8-3 15:06:22 น
*@authorhoojo
* @param ร้องขอ HttpServletRequest
* @param ตอบกลับ HttpServletResponse
* @return บูลีน
* @throwsException
-
getImage บูลีนคงที่สาธารณะ (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse) ส่งข้อยกเว้น {
การตอบสนองรีเซ็ต();
response.setContentType("รูปภาพ/jpeg");
//ตั้งค่าไม่ให้เพจถูกแคช
response.setHeader("Pragma", "ไม่มีแคช");
response.setHeader("ควบคุมแคช", "ไม่มีแคช");
response.setDateHeader("หมดอายุ", 0);
//สร้างภาพในความทรงจำ
รูปภาพ BufferedImage = BufferedImage ใหม่ (WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
// รับบริบทกราฟิก
กราฟิก img = image.getGraphics();
// สร้างคลาสแบบสุ่ม
สุ่ม สุ่ม = สุ่มใหม่();
//กำหนดสีพื้นหลัง
img.setColor(getRandColor(COLOR_FC_BG, COLOR_BC_BG));
img.fillRect(0, 0, กว้าง, สูง);
//ตั้งค่าฟอนต์
img.setFont(แบบอักษรใหม่("Times New Roman", Font.PLAIN, 18));
// วาดเส้นขอบ
// g.setColor(สีใหม่());
// g.drawRect(0,0,ความกว้าง-1,ความสูง-1);
// สุ่มสร้างเส้นรบกวน 155 เส้นเพื่อทำให้รหัสการรับรองความถูกต้องในภาพยากที่จะตรวจพบโดยโปรแกรมอื่น
img.setColor(getRandColor(COLOR_FC_LINE, COLOR_BC_LINE));
สำหรับ (int i = 0; i <155; i++) {
int x = Random.nextInt(กว้าง);
int y = Random.nextInt (ความสูง);
int xl = สุ่ม.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));
สตริงแรนด์ = getRandomChar();
codeValue = codeValue.concat (แรนด์);
img.setFont(getRandomFont());//แบบอักษรสุ่ม
//แสดงรหัสยืนยันตัวตนลงในรูปภาพ
img.setColor(getRandColor(COLOR_FC_CODE, COLOR_BC_CODE));
img.drawString(แรนด์, 13 * i + 6, 16);
-
request.getSession().setAttribute("codeValue", codeValue);
//รูปภาพมีผล
img.ทิ้ง();
// ส่งออกรูปภาพไปยังเพจ
กลับ ImageIO.write (รูปภาพ "JPEG", response.getOutputStream ());
-
-
* สุ่มสร้างอักขระ รวมทั้งตัวพิมพ์ใหญ่ ตัวพิมพ์เล็ก และตัวเลข
* <b>ฟังก์ชัน:</b> ฟังก์ชัน
* @createDate 23-08-2010 10:33:55 น
*@authorhoojo
* @กลับ
-
สตริงสาธารณะ getRandomChar() {
ดัชนี int = (int) Math.round(Math.random() * 2);
สตริง randChar = "";
สวิตช์ (ดัชนี) {
กรณี 0://อักขระตัวพิมพ์ใหญ่
randChar = String.valueOf((ถ่าน)Math.round(Math.random() * 25 + 65));
หยุดพัก;
กรณีที่ 1://อักขระตัวพิมพ์เล็ก
randChar = String.valueOf((ถ่าน)Math.round(Math.random() * 25 + 97));
หยุดพัก;
ค่าเริ่มต้น: // หมายเลข
randChar = String.valueOf(Math.round(Math.random() * 9));
หยุดพัก;
-
ส่งคืน randChar;
-
-
* <b>ฟังก์ชัน:</b> สร้างแบบอักษรและขนาดข้อความแบบสุ่ม
* @createDate 23-08-2010 10:44:22 น
*@authorhoojo
* @กลับ
-
แบบอักษรคงที่สาธารณะ getRandomFont() {
String[] แบบอักษร = {"จอร์เจีย", "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);
กลับแบบอักษรใหม่ (แบบอักษร [fontIndex], Font.PLAIN, ขนาดตัวอักษร);
-
-
ค่าของรหัสยืนยันจะถูกจัดเก็บไว้ในเซสชัน: request.getSession().setAttribute("codeValue", codeValue);
เพียงเปรียบเทียบค่าที่ผู้ใช้ป้อนกับ codeValue ในเซสชันเพื่อดูว่าเท่ากันหรือไม่
ต่อไปนี้คือเพจ jsp ที่เรียกเซิร์ฟเล็ต: ValidCodeServlet.java
คลาสเครื่องมือสร้างรหัสยืนยัน ValidCodeUtils ข้างต้นถูกเรียกใน ValidCodeServlet
แพ็คเกจ com.hoo.servlet;
นำเข้า java.io.IOException;
นำเข้า javax.servlet.ServletException;
นำเข้า javax.servlet.http.HttpServlet;
นำเข้า javax.servlet.http.HttpServletRequest;
นำเข้า javax.servlet.http.HttpServletResponse;
นำเข้า com.hoo.util.ValidCodeUtils;
@SuppressWarnings("อนุกรม")
ValidCodeServlet ระดับสาธารณะขยาย HttpServlet {
โมฆะสาธารณะ doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
พยายาม {
ValidCodeUtils.getImage (คำขอ, ตอบกลับ);
} จับ (ข้อยกเว้นจ) {
e.printStackTrace();
-
-
โมฆะสาธารณะ doPost (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
doGet (คำขอ, การตอบสนอง);
-
-
เพียงเรียกเมธอด servlet บนหน้า jsp
js: วิธีการ reloadValidCode
ฟังก์ชั่นโหลด ValidCode (o) {
o.src = "${pageContext.request.contextPath }/validCodeServlet?timed=" + วันที่ใหม่().getMilliseconds();
-
จำเป็นต้องใช้ "timed=" + new Date().getMilliseconds(); ที่นี่เพื่อป้องกันการแคช 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-name>validCodeServlet</servlet-name>
<url-รูปแบบ>/validCodeServlet</url-รูปแบบ>
</การแมปเซิร์ฟเล็ต>