1 packageedu.zzuli.common;2
3 importjava.awt.Color;4 importjava.awt.Font;5 importjava.awt.Graphics2D;6 importjava.awt.image.BufferedImage;7 importjava.io.IOException;8 importjava.util.Random;9
10 importjavax.imageio.ImageIO;11 importjavax.servlet.ServletException;12 importjavax.servlet.http.HttpServlet;13 importjavax.servlet.http.HttpServletRequest;14 importjavax.servlet.http.HttpServletResponse;15
16
17 /**
18 *@authortianshaojie19 * @date 2011-1-720 * @discription :21 */
22 public class VerifyCodeServlet extendsHttpServlet {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 = newRandom();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 newColor(r, g, b);49 }50
51 @SuppressWarnings("unused")52 private char random2Char(intrandom) {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 returnc;62 }63
64 public voiddoPost(HttpServletRequest request, HttpServletResponse response)65 throwsServletException, IOException {66 doGet(request, response);67 }68
69 public voiddoGet(HttpServletRequest request, HttpServletResponse response)70 throwsServletException, 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 = newBufferedImage(width, height, BufferedImage.TYPE_INT_RGB);79
80 //获取图形上下文
81 Graphics2D g =(Graphics2D) image.getGraphics();82 //生成随机类
83 Random random = newRandom();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 staticString randomCheckCode(HttpServletRequest request) {126 Random random = newRandom();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 returnsRand;134 }135
136 }