验证码是怎样生成的
验证码是怎样生成的
ChinaSEI系列讲义(By郭克华)
验证码是怎样生成的
如果有文字等小错,请多包涵。在不盈利的情况下,欢迎免费传播。 版权所有.郭克华
本讲义经过修正、扩充,由清华大学出版社出版。 详细可查询 /51834
验证码是怎样生成的
1 使用JSP验证码
1.1 为什么需要验证码
为什么需要验证码呢?首先来看下面这张图片,如图1所示:
图1 含有验证码的表单
上面是某系统的登录页面。从页面上可以看出,似乎可以通过账号和密码来进行验证,但是,页面上出现了一个新的输入项:验证码。
验证码有什么作用呢?假想该系统没有验证码,直接通过用户名和密码登录,那么就有可能有恶意的用户不停输入用户名和密码进行登录试探,或者他使用一个输入程序(俗称机器人程序)不停登录,有理由相信总有一天他是能够破解密码的,就可以使用别人的账号了。或者即使他没有破解,只是不停的在登录,服务器每次都会验证数据库,也会严重的降低服务器的效率,导致其他人不能使用。但是有了验证码之后,就可以避免这种现象。如图2所示:
图2 验证码
因为每登录一次服务器,客户都需要提供一次验证码,而验证码每次都是不同的。所以很难使用机器人程序反复登录,因为机器人程序无法认识验证码。这就是验证码强大的功能所在。
所谓验证码,就是由服务器产生的一串随机数字或符号,形成一幅图片,图片应该传给客户端,为了防止客户端用一些程序来进行自动识别,图片中通常要加上一些干扰象素,由用户肉眼识别其中的验证码信息。客户输入表单提交时,验证码也提交给网站服务器,只有验证成功,才能执行实际的数据库操作
验证码在网络投票、交友论坛、网上商城等业务中,经常用来防止恶意客户侵入、恶意灌水、刷票等,在Web中有着重要的应用。
验证码是怎样生成的
1.2 验证码原理
验证码为什么可以防止对网站的恶意访问呢?首先介绍验证码必须满足以下几个性质: 1. 不同的请求,得到的验证码应该是随机的,或者是无法预知的,必须由服务器端产生。
2. 验证码必须通过人眼识别,而通过图像编程的方法编写的机器人程序在客户端运行,几乎无法识别。这就是验证码都比较歪斜或者模糊的原因,否则就很容易通过图像处理算法来识别。
3. 除了人眼观察之外,客户端无法通过其他手段获取验证码信息。这就是验证码为什么用图片,而不是直接用一个数字文本在页面上显示的原因,因为客户端可能通过访问网页源代码的方式获取验证码的内容。
最初的验证码,只是几个随机生成的数字。但是很快就有能识别数字的软件了;目前常见的验证码是随机数字(有的系统也用随机文字)图片验证码,不过,目前也正在研究对验证码的识别。
验证码的工作流程如下:
1. 服务器端随机生成验证码字符串,保存在内存中,并写入图片,将图片连同表单发给客户端。
2. 客户端输入验证码,并提交给表单,服务器端获取客户提交的验证码,和前面产生的的随机数字相比较;如果相同,则继续进行表单所描述的操作(如登录、注册等);如果不同,直接将错误信息返回给客户端。避免程序的继续运行以及访问数据库。
3. 系统生成的一个随机数,大多为数字和字母,或者是数字和字母的组合,然后生成一张根据随机数来确定的图片,把随机数写入到session中,传递到要验证的页面;生成的图片显示给客户端,并要求客户端输入该随机数内容,提交到验证页面,验证session的内容和提交的内容是否一致。
2 验证码开发
2.1 在JSP上实现验证码
在JSP上开发验证码步骤如下:
1.实例化java.awt.image.BufferedImage类。它的作用是访问图像数据缓冲区,或者说就是对所要绘的图片对象进行访问。
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
width、height表示的是产生图片的大小,BufferedImage.TYPE_INT_RGB是指使用的颜色模式为RGB模式(具体其他模式读者可以自己去了解)。
2.从BufferedImange中获取Graphics类对象(画笔),并设定相关属性。
Graphics g = image.getGraphics();
Graphics提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。 g.setColor(Color color);//设置颜色
g.fillRect(int,int,int,int);//设置生成的图片为长方形 3.产生随机数,并将其存入session中。
验证码是怎样生成的
//产生随机数
Random rnd = new Random();
int randNum = rnd.nextInt() + 1000;
String randStr = String.valueOf(randNum); session.setAttribute("randStr", randStr); 4.用画笔画出随机数和干扰点。
g.setColor(Color.black);
g.setFont(new Font("", Font.PLAIN, 20)); g.drawString(randStr, 10, 17);
//随机产生100个干扰点,使图象中的验证码不易被其他程序探测到 for (int i = 0; i < 100; i++){ int x = rnd.nextInt(width); int y = rnd.nextInt(height); g.drawOval(x, y, 1, 1); }
5.输出图像。
// 输出图象到页面
ImageIO.write(Image image, "JPEG", response.getOutputStream()); 6.清除缓冲区。
out.clear();
out = pageContext.pushBody();
下面通过6个步骤在JSP页面生成验证码:
validate.jsp
<%@ page language="java" import="java.awt.*"
import="java.awt.image.BufferedImage" import="java.util.*"
import="javax.imageio.ImageIO" pageEncoding="gb2312"%> <%
response.setHeader("Cache-Control","no-cache"); // 在内存中创建图象 int width = 60, height = 20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //获取画笔 Graphics g = image.getGraphics(); //设定背景色 g.setColor(new Color(200, 200, 200)); g.fillRect(0, 0, width, height);
//取随机产生的验证码(4位数字) Random rnd = new Random(); int randNum = rnd.nextInt(8999) + 1000; String randStr = String.valueOf(randNum);
验证码是怎样生成的
//将验证码存入session
session.setAttribute("randStr", randStr); //将验证码显示到图象中 g.setColor(Color.black);
g.setFont(new Font("", Font.PLAIN, 20)); g.drawString(randStr, 10, 17); // 随机产生100个干扰点,使图象中的验证码不易被其他程序探测到 for (int i = 0; i < 100; i++){ int x = rnd.nextInt(width); int y = rnd.nextInt(height); g.drawOval(x, y, 1, 1); } // 输出图象到页面
ImageIO.write(image, "JPEG", response.getOutputStream()); out.clear(); out = pageContext.pushBody(); %>
在浏览器中访问validate.jsp页面得到(当然读者的机器上获得的验证码不一定相同)如图3所示:
图3 生产的验证码
刷新,获得不同的验证码。 但是验证码单 …… 此处隐藏:3264字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [初中教育]婚姻家庭法学教学教案
- [初中教育]浅谈小学语文教学中的创新教育
- [初中教育]中华人民共和国侵权责任法2009
- [初中教育]2016-2022年中国薄膜太阳能电池行业发
- [初中教育]多级轻型井点降水的应用
- [初中教育]外语教学法流派介绍和简评
- [初中教育]实验一、典型环节及其阶跃响应
- [初中教育]内蒙古2012-2013学年度国家奖学金获奖
- [初中教育]移动通信营销渠道管理探讨
- [初中教育]初三化学第一学期第一第二章基础知识点
- [初中教育]一天的食物教学设计
- [初中教育]光导照明系统的基本结构及工作原理
- [初中教育]长春市十一高、东北师范大学附属中学、
- [初中教育]“十三五”规划重点-配重式装卸车项目
- [初中教育]领导方法和领导艺术
- [初中教育]第三章 植物病虫草鼠害诊断与防治基
- [初中教育]2019届九年级语文上册 第二单元 6纪念
- [初中教育]甲级单位编制水豆腐项目可行性报告(立
- [初中教育]Ch8-1补充 09101数据库系统原理及应用-
- [初中教育]2017-2023年中国吊装设备行业市场分析
- 制作毕业纪念册需要哪些材料
- 2015-2016学年高二化学苏教版选修4课件
- 哈佛管理导师-创建商业案例
- 职场交际中的谈吐礼仪知识与职场会议接
- 中国糕点及面包行业发展现状与竞争战略
- 沂河“12·7”洪水茶山拦河坝
- 管道水流量计算公式
- 4-2发电机火灾事故处置方案
- 数字信号处理实验五
- 2009年经济师(中级)金融专业知识全真试
- 历史街区保护规划--04历史文化遗产保护
- 宁夏回族自治区中小学职称评价标准
- 评先评优测评表
- 圆的切线证明及线段长求解在在中考中的
- 【解析版】2015年江苏省南京外国语学校
- 人教版八年级上册科学第一章习题精华
- 责任心与执行力
- SA8000社会责任管理体系标准培训
- IgA肾病的饮食应注意
- 杭州市建设工程文件归档整理方案(试行)




