- 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);
- }
- }
转载于:https://blog.51cto.com/thinkingjava/394058