找这个文件,而是根据 web。xml 中配置把request 发送给 CaptchaServlet 并等
待它做出响应。
109 / 148
…………………………………………………………Page 110……………………………………………………………
请大家注意,jsp 和 servlet 并不是只能返回 html 格式的数据,实际上它们可
以生成任意格式的数据,比如这里我们就用 servlet 生成了一个图片。正如我们
之前讨论 forward 时提到的,第 3。4。2 节 “forward 导致找不到图片”,浏览
器只是向服务器发送了一个请求,这个请求的地址是/captcha。jpg 还是
/index。jsp 并没有什么区别,在服务器看来他们仅仅是一个字符串而已,接收
到请求后服务器先去按照 web。xml 中的配置做映射,将请求交给对应的 servlet
处理,如果 web。xml 中没有对应这个请求的映射,才会去磁盘查找是否有这么一
个文件,找到文件则输出到响应中传回客户端,如果找不到就返回经典的 404(找
不到访问资源)。
其实我们使用的/check。do 也是一样的道理,你在服务器上找不到名叫 check。do
的文件,它只是一个指向CheckServlet 的道标,告诉服务器调用CheckServlet
处理这个请求,请记住,这些仅仅是请求,你永远不知道服务器会返回给你什么。
代码请大家参考 12…01/WEB…INF/src/CaptchaServlet。java,因为 img 只可能通
过 GET 方式发送请求,所以我们仅仅定义了 doGet()方法。
public void doGet(HttpServletRequest request; HttpServletResponse
response)
throws ServletException; IOException {
//设置页面不缓存
response。setHeader(〃Pragma〃; 〃No…cache〃);
response。setHeader(〃Cache…Control〃; 〃no…cache〃);
response。setDateHeader(〃Expires〃; 0);
// 在内存中创建图象
int width = 60; height = 20;
BufferedImage image = new BufferedImage(width; height;
BufferedImage。TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image。getGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g。setColor(getRandColor(200; 250));
g。fillRect(0; 0; width; height);
//设定字体
g。setFont(new Font(〃Times New Roman〃; Font。PLAIN; 18));
110 / 148
…………………………………………………………Page 111……………………………………………………………
//画边框
//g。setColor(new Color());
//g。drawRect(0; 0; width 1; height 1);
// 随机产生 155条干扰线,使图象中的认证码不易被其它程序探测到
g。setColor(getRandColor(160; 200));
for (int i = 0; i 《 155; i++) {
int x = random。nextInt(width);
int y = random。nextInt(height);
int xl = random。nextInt(12);
int yl = random。nextInt(12);
g。drawLine(x;y;x+xl;y+yl);
}
// 取随机产生的认证码 (4位数字)
String sRand = 〃〃 ;
for (int i = 0;i 《 4; i++) {
String rand = String。valueOf(random。nextInt(10));
sRand += rand;
// 将认证码显示到图象中
// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接
生成
g。setColor(new Color(20 + random。nextInt(110); 20 +
random。nextInt(110); 20 + random。nextInt(110)));
g。drawString(rand; 13 * i + 6; 16);
}
// 将认证码存入 SESSION
request。getSession()。setAttribute(〃captcha〃; sRand);
// 图象生效
g。dispose();
// 输出图象到页面
ImageIO。write(image; 〃JPEG〃; response。getOutputStream());
}
代码最先设置 response (响应)中的头部配置,告诉浏览器不要缓存对
/captcha。jpg 的请求结果,这样才能保证每次刷新页面都看到最新生成的图片,
要是设置了缓存很可能每次看到的都是最先请求看到的图片。
中间一大段代码实现动态生成图片的功能,我们先随机获得几个数字,然后写到
BufferedImage 中,最后就可以把图片数据写到response,因为图片是二进制数
111 / 148
…………………………………………………………Page 112……………………………………………………………
据,所以我们使用了 response。getOutputStream()而不是
response。getWriter()。
为了达到验证的功能,每次生成图片之后要记得讲随机得到的数字保存到
session 中,session 中的变量可以跨越多个请求周期存在,等用户输入验证码
提交后就能与 session 中的数据做比较了,这些是在CheckServlet 中实现的。
public void doPost(HttpServletRequest request; HttpServletResponse
response)
throws ServletException; IOException {
HttpSession session = request。getSession();
String requestCaptcha = request。getParameter(〃captcha〃);
String sessionCaptcha = (String) session。getAttribute(〃captcha〃);
if (sessionCaptcha != null &&
sessionCaptcha。equals(requestCaptcha)) {
session。removeAttribute(〃captcha〃);
request。getRequestDispatcher(〃/success。jsp〃)。forward(request;
response);
} else {
request。setAttribute(〃message〃; 〃验证码输入错误〃);
request。getRequestDispatcher(〃/index。jsp〃)。forward(request;
response);
}
}
这样我们便获得了彩色图性校验码的功能,例子在 12…01 目录下。
12。2。 图片校验码 jsp 版
使用 servlet 既需要编译源代码,又要在web。xml 加入对应的请求映射。如果只
是需要简单的验证码功能,我们也可以使用 jsp 实现。
我们已经知道 jsp 就是 servlet 的另一种形式,servlet 能做的事情 jsp 也可以
实现,下面就是实现 CaptchaServlet 功能的 captcha。jsp。
255) {
fc = 255;
}
if (bc 》 255) {
bc = 255;
}
int r = fc + random。nextInt(bc fc);
int g = fc + random。nextInt(bc fc);
int b = fc + random。nextInt(bc fc);
return new Color(r; g; b);
}
%》
小说推荐
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 最新章:第31章
- asp基础实用教程(DOC格式)
- 目 录一、关于ASP二、ASP的新功能三、创建ASP页四、使用脚本语言五、使用变量和常量六、使用集合七、ASP内建对象八、向浏览器发送内容九、包含文件十、访问数据库十一、调试ASP脚本十二、维护ASP应用程序的安全一、关于ASP Active Server Pages(ASP)是服务器端脚本编写环境
- 最新章:第17章
- asp基础入门篇(DOC格式)
- ASP入门与实例-IIS的安装与配置1、运行环境与软件要求Windows 2000 以上(不包括Windows XP Home版)IIS 4.0 以上Microsoft Access 2000Dreamweaver MX2、IIS的安装与配置a.安装IIS若操作系统中还未安装IIS服务器,可打开"控
- 最新章:第23章
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 最新章:第28章
- C语言实例教程(PDF格式)
- -Page 1-前 言Visual C+是开发运行于Windows 95和Windows NT环境下的Win32应用程序的可视化编程工具中最重要的成员之一,它为软件开发人员提供了完整的编辑、编译和调试工具和建立于Win32 API(ApplicationProgramming Interface)基
- 最新章:第143章
- Word2003使用技巧大全(DOC格式)
- Word使用技巧(二)表格使用大全更新时间:2009-11-16 19:32:15 本文共阅读了257次 作者:xushezheng 文章来源:电教组字体大小:大中小一、快速插入表格 拖动“插入表格”能插入的最大表格跟该图标位置、显示分辨率有关。如使用800×600分辨率时最大为18行×28列 二、
- 最新章:第1章
- Excel word ppt office使用技巧大全(DOC格式)
- -Page 1-Excel_word_ppt_使用技巧大全(完全版)Excelwordppt使用技巧大全(2011新版本)I-Page 2-Excel_word_ppt_使用技巧大全(完全版
- 最新章:第338章
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章