java 实现验证码

  1 package edu.zzuli.common;
  2 
  3 import java.awt.Color;
  4 import java.awt.Font;
  5 import java.awt.Graphics2D;
  6 import java.awt.image.BufferedImage;
  7 import java.io.IOException;
  8 import java.util.Random;
  9 
 10 import javax.imageio.ImageIO;
 11 import javax.servlet.ServletException;
 12 import javax.servlet.http.HttpServlet;
 13 import javax.servlet.http.HttpServletRequest;
 14 import javax.servlet.http.HttpServletResponse;
 15 
 16 
 17 /**
 18  * @author tianshaojie
 19  * @date 2011-1-7
 20  * @discription :
 21  */
 22 public class VerifyCodeServlet extends HttpServlet {
 23         
 24         private static final long serialVersionUID = -7713673953332628094L;
 25 
 26         private Font mFont = new Font("Arial Black", Font.BOLD, 15); // 设置字体new  Font("Arial Black",  Font.PLAIN, 15);
 27 
 28         private int lineWidth = 5; // 2// 干扰线的长度=1.414*lineWidth
 29 
 30         private int width = 60; // 定义图形大小
 31 
 32         private int height = 20; // 定义图形大小
 33 
 34         private int count = 300;// 200
 35 
 36         private Color getRandColor(int fc, int bc) { // 取得给定范围随机颜色
 37                 Random random = new Random();
 38                 if (fc > 255) {
 39                         fc = 255;
 40                 }
 41                 if (bc > 255) {
 42                         bc = 255;
 43                 }
 44                 int r = fc + random.nextInt(bc - fc);
 45 
 46                 int g = fc + random.nextInt(bc - fc);
 47                 int b = fc + random.nextInt(bc - fc);
 48                 return new Color(r, g, b);
 49         }
 50 
 51         @SuppressWarnings("unused")
 52         private char random2Char(int random) {
 53                 char c = '0';
 54                 if (random >= 0 && random <= 9) {
 55                         c = (char) (random + 48);
 56                 } else if (random >= 10 && random <= 35) {
 57                         c = (char) (random + 55);
 58                 } else if (random >= 36 && random <= 61) {
 59                         c = (char) (random + 61);
 60                 }
 61                 return c;
 62         }
 63 
 64         public void doPost(HttpServletRequest request, HttpServletResponse response)
 65                         throws ServletException, IOException {
 66                 doGet(request, response);
 67         }
 68 
 69         public void doGet(HttpServletRequest request, HttpServletResponse response)
 70                         throws ServletException, IOException {
 71                 // response.reset();
 72                 // 设置页面不缓存
 73                 response.setHeader("Pragma", "No-cache");
 74                 response.setHeader("Cache-Control", "no-cache");
 75                 response.setDateHeader("Expires", 0);
 76                 response.setContentType("image/gif");
 77                 // 在内存中创建图象
 78                 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
 79 
 80                 // 获取图形上下文
 81                 Graphics2D g = (Graphics2D) image.getGraphics();
 82                 // 生成随机类
 83                 Random random = new Random();
 84                 // 设定背景色
 85                 g.setColor(getRandColor(200, 250)); // ---1
 86                 g.fillRect(0, 0, width, height);
 87 
 88                 // 设定字体
 89                 g.setFont(mFont);
 90 
 91                 // 画边框
 92                 g.setColor(getRandColor(0, 20)); // ---2
 93                 g.drawRect(0, 0, width - 1, height - 1);
 94 
 95                 // 随机产生干扰线,使图象中的认证码不易被其它程序探测到
 96                 for (int i = 0; i < count; i++) {
 97                         g.setColor(getRandColor(150, 200)); // ---3
 98                         int x = random.nextInt(width - lineWidth - 1) + 1; // 保证画在边框之内
 99                         int y = random.nextInt(height - lineWidth - 1) + 1;
100                         int xl = random.nextInt(lineWidth);
101                         int yl = random.nextInt(lineWidth);
102                         g.drawLine(x, y, x + xl, y + yl);
103                 }
104 
105                 // 取随机产生的认证码(4位数字)
106                 String sRand = "";
107 
108                 for (int i = 0; i < 4; i++) {
109                         // String rand = String.valueOf(random2Char(random.nextInt(62)));
110                         String rand = String.valueOf(random.nextInt(10));
111                         sRand += rand;
112                         // 将认证码显示到图象中,调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
113                         g.setColor(new Color(20 + random.nextInt(130), 20 + random.nextInt(130), 20 + random.nextInt(130))); // --4--50-100
114                         g.drawString(rand, (13 * i) + 6, 16);
115                 }
116                 // 将认证码存入SESSION
117                 request.getSession().setAttribute(Constants_core.RANDOM_CHECKCODE, sRand);
118                 // System.out.println("checkcode:"+sRand);
119                 // 图象生效
120                 g.dispose();
121                 // 输出图象到页面
122                 ImageIO.write(image, "PNG", response.getOutputStream());
123         }
124 
125         public static String randomCheckCode(HttpServletRequest request) {
126                 Random random = new Random();
127                 String sRand = "";
128                 for (int i = 0; i < 4; i++) {
129                         String rand = String.valueOf(random.nextInt(10));
130                         sRand += rand;
131                 }
132                 request.getSession().setAttribute(Constants_core.RANDOM_CHECKCODE, sRand);
133                 return sRand;
134         }
135 
136 }
原文地址:https://www.cnblogs.com/XiaoGer/p/3605670.html