標籤:
ValidateCodeServlet.java
package com.hpe.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;@WebServlet("/ValidateCodeServlet")public class ValidateCodeServlet extends HttpServlet { private static final long serialVersionUID = 1L; public ValidateCodeServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 回應標頭資訊 response.setHeader("Pragma", "No-Cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expries", 0); // 隨機數產生類 Random random = new Random(); // 定義驗證碼的位元 int size = 5; // 定義變數儲存產生的驗證碼 String vCode = ""; char c; // 產生驗證碼 for (int i = 0; i < size; i++) { // 產生一個26以內的隨機整數 int number = random.nextInt(26); // 如果產生的是偶數,則隨機產生一個數字 if (number % 2 == 0) { c = (char) (‘0‘ + (char) ((int) (Math.random() * 10))); // 如果產生的是奇數,則隨機產生一個字母 } else { c = (char) ((char) ((int) (Math.random() * 26)) + ‘A‘); } vCode = vCode + c; } // 儲存產生的5位驗證碼 request.getSession().setAttribute("vCode", vCode); // 驗證碼圖片的產生 // 定義圖片的寬度和高度 int width = (int) Math.ceil(size * 20); int height = 50; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 擷取圖片的上下文 Graphics gr = image.getGraphics(); // 設定圖片背景顏色 gr.setColor(Color.WHITE); gr.fillRect(0, 0, width, height); // 設定圖片邊框 gr.setColor(Color.GRAY); gr.drawRect(0, 0, width - 1, height - 1); // 畫十條幹擾線 for (int i = 0; i < 5; i++) { int x1 = random.nextInt(width); int y1 = random.nextInt(height); int x2 = random.nextInt(width); int y2 = random.nextInt(height); gr.setColor(randomColor()); gr.drawLine(x1, y1, x2, y2); } // 設定字型,畫驗證碼 gr.setColor(randomColor()); gr.setFont(randomFont()); gr.drawString(vCode, 10, 22); // 映像生效 gr.dispose(); // 輸出到頁面 ImageIO.write(image, "JPEG", response.getOutputStream()); } // 產生隨機的顏色 private Color randomColor() { int red = r.nextInt(150); int green = r.nextInt(150); int blue = r.nextInt(150); return new Color(red, green, blue); } private String[] fontNames = { "宋體", "華文楷體", "黑體", "微軟雅黑", "楷體_GB2312" }; private Random r = new Random(); // 產生隨機的字型 private Font randomFont() { int index = r.nextInt(fontNames.length); String fontName = fontNames[index];// 產生隨機的字型名稱 int style = r.nextInt(4); int size = r.nextInt(3) + 24; // 產生隨機字型大小, 24 ~ 28 return new Font(fontName, style, size); }}
直接運行Java產生的結果:
在網頁上顯示的效果:
jsp驗證碼的產生