- package book.servlet;
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics;
- import java.awt.p_w_picpath.BufferedImage;
- import java.io.IOException;
- import java.util.Random;
- import javax.p_w_picpathio.ImageIO;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * 生成圖形驗證碼的Servlet
- */
- public class ImageCodeMakerServlet extends HttpServlet {
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doPost(req, resp);
- }
- /**
- * @see javax.servlet.http.HttpServlet#void
- * (javax.servlet.http.HttpServletRequest,
- * javax.servlet.http.HttpServletResponse)
- */
- public void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- System.out.println("和峨峨峨峨峨峨峨峨峨峨");
- // 首先設置頁面不緩存
- resp.setHeader("Pragma", "No-cache");
- resp.setHeader("Cache-Control", "no-cache");
- resp.setDateHeader("Expires", 0);
- // 定義圖片的寬度和高度
- int width = 90, height = 40;
- // 創建一個圖像對象
- BufferedImage p_w_picpath = new BufferedImage(width, height,
- BufferedImage.TYPE_INT_RGB);
- // 得到圖像的環境對象
- Graphics g = p_w_picpath.createGraphics();
- Random random = new Random();
- // 用隨機顏色填充圖像背景
- g.setColor(getRandColor(180, 250));
- g.fillRect(0, 0, width, height);
- for (int i = 0; i < 5; i++) {
- g.setColor(getRandColor(50, 100));
- int x = random.nextInt(width);
- int y = random.nextInt(height);
- g.drawOval(x, y, 4, 4);
- }
- // 設置字體,下面準備畫隨機數
- g.setFont(new Font("", Font.PLAIN, 40));
- // 隨機數字符串
- String sRand = "";
- for (int i = 0; i < 4; i++) {
- // 生成四個數字字符
- String rand = String.valueOf(random.nextInt(10));
- sRand += rand;
- // 生成隨機顏色
- g.setColor(new Color(20 + random.nextInt(80), 20 + random
- .nextInt(100), 20 + random.nextInt(90)));
- // 將隨機數字畫在圖像上
- g.drawString(rand, (17 + random.nextInt(3)) * i + 8, 34);
- // 生成干擾線
- for (int k = 0; k < 12; k++) {
- int x = random.nextInt(width);
- int y = random.nextInt(height);
- int xl = random.nextInt(9);
- int yl = random.nextInt(9);
- g.drawLine(x, y, x + xl, y + yl);
- }
- }
- // 將生成的隨機數字字符串寫入Session
- req.getSession().setAttribute("randcode", sRand);
- // 使圖像生效
- g.dispose();
- // 輸出圖像到頁面
- ImageIO.write(p_w_picpath, "JPEG", resp.getOutputStream());
- }
- /**
- * 產生一個隨機的顏色
- * @param fc 顏色分量最小值
- * @param bc 顏色分量最大值
- * @return
- */
- public Color getRandColor(int fc, int bc) {
- Random random = new Random();
- if (fc > 255){
- fc = 255;
- }
- if (bc > 255){
- bc = 255;
- }
- int r = fc + random.nextInt(bc - fc);
- int g = fc + random.nextInt(bc - fc);
- int b = fc + random.nextInt(bc - fc);
- return new Color(r, g, b);
- }
- }