验证码(CAPTCHA)是”Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止 :恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。
验证码包含两部分输入框和显示验证码的图片两部分。
一. 使用servlet实现验证码
生成验证码图片用到的类:
- BufferedImage类
- Graphics类
- Color类
- Random类
- ImageIO类
生成验证码图片的实现步骤:
创建BufferedImage对象
BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB); //参数分别为图片的宽度、高度、类型
创建Graphics对象和Color对象
Graphics g = bi.getGraphic(); //通过BufferedImage对象创建一个Graphics对象 Color c = new Color(200, 200, 200); //通过RGB的值创建一个Color对象
创建Random对象
char[] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray(); //创建一个含有所有大写字母和数字的字符数组 Random r = Random(); //创建一个随机数对象
通过Random产生随机验证码信息并使用Graphics绘制图片
g.setColor(c); //设置颜色 g.fillRect(0, 0, 68, 22) //绘制一个宽为68,高为22的矩形作为图片背景 //通过循环取出四个随机字符作为验证码 int number; StringBuffer sb = new StringBuffer(); //用于保存取出的字符 for(int i = 0; i < 4; i++){ number = r.nextInt(ch.length); //在字符数组的长度范围内获得一个随机数 g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255))); //随机获得每个字符的颜色 g.drawString(ch[number] + "", (i * 15) + 3, 18); //第一个参数是要绘制的字符,后面两个参数是绘制的位置信息。 sb.append(ch[number]); }
记录验证码信息到session中
request.getSession().setAttribute("captcha", sb.toString());
使用ImageIO输出图片
ImageIO.write(bi, "JPG", response.getOutputStream()); //第一个参数为BufferedImage对象, 第二个参数为输出的图片类型, 第三个参数为输出的目标
以上仅仅是生成了一个非常简单的验证码的一个方法, 我们还可以通过第三方的组件去实现验证码。如:Jcaptcha、Kcaptcha等。
Keep Going…