java实现空心验证码_java 实现验证码

本文介绍了一个使用Java实现的空心验证码生成器,通过创建BufferedImage对象并使用Graphics2D进行绘制,包括设置背景色、字体、边框,以及绘制干扰线和随机数字。最后将生成的验证码保存在SESSION中并输出为PNG图像。
摘要由CSDN通过智能技术生成

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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值