一、关于验证码
首先来说,验证码在我们的日常登录,发表言论时比较常见,它是一种用来区分登录用户是人还是机器的一种公共自动程序。它可以防止恶意破解密码、刷票、论坛灌水。
二、用java来实现验证码
了解了验证码的作用,接下来我们就用java来实现验证码这一功能。首先我们先分析一下,怎么生成一个验证码。我们需要一个BufferedImage对象来保存图片;通过它来获得Graphics对象;通过Randrom产生随机验证码信息;使用Graphics绘制图片;记录验证码信息到session中;使用ImageIO输出图片;
1 package com.water.servlet; 2 3 import com.sun.javafx.font.FontStrike; 4 5 import javax.imageio.ImageIO; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse;10 import java.awt.*;11 import java.awt.image.BufferedImage;12 import java.io.IOException;13 import java.util.Random;14 15 public class ImgServlet extends HttpServlet {16 @Override17 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {18 BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB);19 Graphics graphics = bi.getGraphics();20 Color color = new Color(200, 150, 255);21 graphics.setColor(color);22 graphics.fillRect(0,0,68,32);23 char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();24 StringBuffer sb = new StringBuffer();25 Random random = new Random();26 for (int i = 0; i < 4; i++) {27 char aChar = chars[random.nextInt(36)];28 graphics.setColor(new Color(random.nextInt(88),random.nextInt(188),random.nextInt(255)));29 graphics.drawString(aChar+"",(i*15)+3,18);30 sb.append(aChar);31 }32 req.getSession().setAttribute("charCode",sb.toString());33 ImageIO.write(bi,"jpg",resp.getOutputStream());34 35 }36 }
写一个 登录页面来检验验证码的正确与否。
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 3 419 20 21checkCode 5 11 12 13
通过验证,我们发现验证码可以正确显示并能实现验证功能。但是在日常中,有着各种各样的验证码:算术类型,文字类型,动画类型,纯数字类型,数字与文字、字母相结合类型等等,那么我们在开发中该怎么实现这些功能呢?
三、 验证码组件
我们能够走的更远更扎实,是因为我们站在巨人的肩旁上。我们的前辈们,已经开发了一些很好的组件可供我们使用,比如下面这些:Jcaptcha组件和Kaptcha组件。由于Jcaptcha组件需要和Spring框架结合来使用,我们就先咱不做介绍,我们主要来说一说Kaptcha组件。
a. 使用之前要先下载(提取密码:1vrf)
b. 然后是在web.xml中配置它
12 5Kaptcha 3com.google.com.kaptcha.servlet.KaptchaServlet 46 Kaptcha 7/randromCode.jpg 8
Tips:Kaptcha组件还有很多配置选项供我们使用。
1 26 7 8 153Kaptcha 910 KaptchaServlet 11 1213 17图片边框,合法值:yes , no 14kaptcha.border 15yes 1618 2519 边框颜色,合法值: r,g,b (and optional alpha) 或者 20 white,black,blue. 21 22kaptcha.border.color 23black 2426 30边框厚度,合法值:>0 27kaptcha.border.thickness 281 2931 35图片宽 200 32kaptcha.image.width 33200 3436 40图片高 50 37kaptcha.image.height 3850 3941 47图片实现类 42kaptcha.producer.impl 4344 com.google.code.kaptcha.impl.DefaultKaptcha 45 4648 54文本实现类 49kaptcha.textproducer.impl 5051 com.google.code.kaptcha.text.impl.DefaultTextCreator 52 5355 59文本集合,验证码值从此集合中获取 56kaptcha.textproducer.char.string 571234567890 5860 64验证码长度 5 61kaptcha.textproducer.char.length 622 6365 69字体 Arial, Courier 66kaptcha.textproducer.font.names 67Arial, Courier 6870 74字体大小 40px. 71kaptcha.textproducer.font.size 7240 7375 8176 字体颜色,合法值: r,g,b 或者 white,black,blue. 77 78kaptcha.textproducer.font.color 79black 8082 86文字间隔 2 83kaptcha.textproducer.char.space 842 8587 94干扰实现类 88kaptcha.noise.impl 8990 91 com.google.code.kaptcha.impl.DefaultNoise 92 9395 10196 干扰颜色,合法值: r,g,b 或者 white,black,blue. 97 98kaptcha.noise.color 99black 100102 112103 图片样式: 水纹com.google.code.kaptcha.impl.WaterRipple104 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy105 阴影com.google.code.kaptcha.impl.ShadowGimpy106 107kaptcha.obscurificator.impl 108109 com.google.code.kaptcha.impl.WaterRipple110 111113 119背景实现类 114kaptcha.background.impl 115116 com.google.code.kaptcha.impl.DefaultBackground117 118120 124背景颜色渐变,开始颜色 121kaptcha.background.clear.from 122green 123125 129背景颜色渐变,结束颜色 126kaptcha.background.clear.to 127white 128130 136文字渲染器 131kaptcha.word.impl 132133 com.google.code.kaptcha.text.impl.DefaultWordRenderer134 135137 143138 session中存放验证码的key键139 140kaptcha.session.key 141KAPTCHA_SESSION_KEY 142144 152145 The date the kaptcha is generated is put into the146 HttpSession. This is the key value for that item in the147 session.148 149kaptcha.session.date 150KAPTCHA_SESSION_DATE 151154 157 158Kaptcha 155/randomcode.jpg 156
当我们需要使用那些效果时,我们可以在web.xml中配置它们。