1 package servlet;
  2 import java.awt.Color;
  3 import java.awt.Font;
  4 import java.awt.Graphics;
  5 import java.awt.Graphics2D;
  6 import java.awt.image.BufferedImage;
  7 import java.io.IOException;
  8 import java.util.Random;
  9 import javax.imageio.ImageIO;
 10 import javax.servlet.ServletException;
 11 import javax.servlet.http.HttpServlet;
 12 import javax.servlet.http.HttpServletRequest;
 13 import javax.servlet.http.HttpServletResponse;
 14 /**
 15  * 通过javaAPI在内存中生成一张图片。
 16  * 通过response的输出流响应给客户端。
 17  */
 18 public class CheckCode extends HttpServlet {
 19     public void doGet(HttpServletRequest request, HttpServletResponse response)
 20             throws ServletException, IOException {
 21         // 禁止缓存
 22         // response.setHeader("Cache-Control", "no-cache");
 23         // response.setHeader("Pragma", "no-cache");
 24         // response.setDateHeader("Expires", -1);
 25         int width = 120;
 26         int height = 30;
 27         // 步骤一 绘制一张内存中图片
 28         BufferedImage bufferedImage = new BufferedImage(width, height,
 29                 BufferedImage.TYPE_INT_RGB);
 30         // 步骤二 图片绘制背景颜色 ---通过绘图对象
 31         Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔
 32         // 绘制任何图形之前 都必须指定一个颜色
 33         graphics.setColor(getRandColor(200, 250));
 34         graphics.fillRect(0, 0, width, height);
 35         // 步骤三 绘制边框
 36         graphics.setColor(Color.WHITE);
 37         graphics.drawRect(0, 0, width - 1, height - 1);
 38         // 步骤四 四个随机数字
 39         Graphics2D graphics2d = (Graphics2D) graphics;
 40         // 设置输出字体
 41         graphics2d.setFont(new Font("宋体", Font.BOLD, 18));
 42         String words =
 43          "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
 44         Random random = new Random();// 生成随机数
 45         // 将随机生成的验证码保存到session:
 46         StringBuffer buffer = new StringBuffer();
 47         // 定义x坐标
 48         int x = 10;
 49         for (int i = 0; i < 4; i++) {
 50             // 随机颜色
 51             graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random
 52                     .nextInt(110), 20 + random.nextInt(110)));
 53             // 旋转 -30 --- 30度
 54             int jiaodu = random.nextInt(60) - 30;
 55             // 换算弧度
 56             double theta = jiaodu * Math.PI / 180;
 57             // 生成一个随机数字
 58             int index = random.nextInt(words.length()); // 生成随机数 0 到 length - 1
 59             // 获得字母数字
 60             char c = words.charAt(index);
 61             // 将生成汉字 加入buffer
 62             buffer.append(c);
 63             // 将c 输出到图片
 64             graphics2d.rotate(theta, x, 20);
 65             graphics2d.drawString(String.valueOf(c), x, 20);
 66             graphics2d.rotate(-theta, x, 20);
 67             x += 30;
 68         }
 69         //Jis1 存储到Session
 70         request.getSession().setAttribute("code", buffer.toString());
 71         System.out.print("存储在Session中。");
 72         System.out.println(buffer.toString());
 73         // 步骤五 绘制干扰线
 74         graphics.setColor(getRandColor(160, 200));
 75         int x1;
 76         int x2;
 77         int y1;
 78         int y2;
 79         for (int i = 0; i < 30; i++) {
 80             x1 = random.nextInt(width);
 81             x2 = random.nextInt(12);
 82             y1 = random.nextInt(height);
 83             y2 = random.nextInt(12);
 84             graphics.drawLine(x1, y1, x1 + x2, x2 + y2);
 85         }
 86         // 将上面图片输出到浏览器 ImageIO
 87         graphics.dispose();// 释放资源
 88         ImageIO.write(bufferedImage, "jpg", response.getOutputStream());
 89     }
 90     public void doPost(HttpServletRequest request, HttpServletResponse response)
 91             throws ServletException, IOException {
 92         doGet(request, response);
 93     }
 94     /**
 95      * 取其某一范围的color
 96      * @param fc
 97      *            int 范围参数1
 98      * @param bc
 99      *            int 范围参数2
100      * @return Color
101      */
102     private Color getRandColor(int fc, int bc) {
103         // 取其随机颜色
104         Random random = new Random();
105         if (fc > 255) {
106             fc = 255;
107         }
108         if (bc > 255) {
109             bc = 255;
110         }
111         int r = fc + random.nextInt(bc - fc);
112         int g = fc + random.nextInt(bc - fc);
113         int b = fc + random.nextInt(bc - fc);
114         return new Color(r, g, b);
115     }
116 }

直接将img的src属性指向该servlet的路径即可产生验证码图片.

使用javascript实现图片的刷新,通过js改变src的属性值,给属性值加上时间戳。?time=new Date().getTime();

posted on 2018-05-17 22:44  zeronexyz  阅读(284)  评论(0编辑  收藏  举报