Servlet生成隨機驗證碼
package com.yc.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/code")
public class CreateCodeServlet extends HttpServlet{
private static final long serialVersionUID = -8482385671566727162L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
String code = getRandomCode();
// 將隨機生成的驗證碼存到session中,以便使用者登入的時候獲取校驗
HttpSession session = request.getSession();
session.setAttribute("validateCode", code);
// 建立驗證碼圖形物件,大小為110*28
BufferedImage image = getCodeImage(code, 110, 28);
ImageIO.write(image, "JPEG", response.getOutputStream());
}
/**
* 獲取驗證碼圖形
* @param code
* @param width
* @param height
* @return
*/
private BufferedImage getCodeImage(String code, int width, int height) {
// 建立圖形物件
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 獲取圖形的繪製繪製物件
Graphics g = image.getGraphics();
// 設定圖形的背景顏色
g.setColor(getRandomColor(225, 30));
// 設定繪製的邊界
g.fillRect(0, 0, width, height);
// 設定字型 Courier New
g.setFont(new Font("楷體", Font.ITALIC, 20));
// 生產干擾線
// 設定干擾線的顏色
g.setColor(getRandomColor(160, 40));
// 隨機繪製干擾線
int x1, y1, x2, y2;
Random rd = new Random();
for (int i = 0; i < 100; i++) {
x1 = rd.nextInt(width);
y1 = rd.nextInt(height);
x2 = rd.nextInt(width);
y2 = rd.nextInt(height);
g.drawLine(x1, y1, x2, y2);
}
// 繪製驗證碼
char[] codes = code.toCharArray();
for (int i = 0, len = codes.length; i < len; i++) {
// 設定驗證碼繪製的顏色
g.setColor(getRandomColor(50, 80));
g.drawString(String.valueOf(codes[i]), 10 + 24*i, 20);
}
g.dispose();
return image;
}
/**
* 生成驗證碼的方法
* @return
*/
private String getRandomCode() {
// 如何生存4位的隨機驗證碼? - 包含大寫字母、小寫字母和數字
Random rd = new Random();
StringBuffer sbf = new StringBuffer();
int flag;
for (int i = 0; i < 4; i++) {
flag = rd.nextInt(4);
switch(flag) {
case 0: sbf.append(rd.nextInt(10)); break; // 生成數字
case 1: sbf.append((char)(rd.nextInt(26) + 65)); break; // 生成大寫字母
case 2: sbf.append((char)(rd.nextInt(26) + 97)); break; // 生成小寫字母
case 3: sbf.append((char)(rd.nextInt(20000) + 19968)); break; // 生成小寫字母
}
}
return sbf.toString();
}
/**
* 獲取隨機顏色的方法
* @return
*/
private Color getRandomColor(int start, int bound) {
Random rd = new Random();
int r = start + rd.nextInt(bound);
int g = start + rd.nextInt(bound);
int b = start + rd.nextInt(bound);
return new Color(r, g, b);
}
}