servlet编写的验证吗.docx_第1页
servlet编写的验证吗.docx_第2页
servlet编写的验证吗.docx_第3页
servlet编写的验证吗.docx_第4页
servlet编写的验证吗.docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

利用Servlet生成验证码(2008-06-23 21:39:15) 转载标签: servlet验证码it分类: JavaEE jsp中验证码的使用设计思路:我们上网的时候经常可以看到,在登录某个网站的时候,在输入用户名和密码的同时,也需要输入验证码,这三项同时正确的时候,才允许登录。 验证码有效的防止用户利用机器人自动注册、登录、灌水。什么是验证码?他的功能是什么?验证码本质就是一张图片,图片上面有一串随机的字符串。我们在使用网站的登录注册等模块的时候,通过我们的肉眼观察图片中显示的字符串,然后输入,这样就确保了是一个人在使用系统的功能。 然而随着现在的OCR(图像识别) 技术,对验证码的要求也就越来越高了,不能仅仅的只是一串随机字符串。还需要在字符串的背后参杂一些干扰OCR的像素和线条。 经过上面的分析。如果要自己设计和制作一个验证码,我们要面对的主要问题有:1 产生一个随机的字符串2利用生成的随机字符串加上一些提供干扰的像素和线条。3在验证的时候可以得到我们之前生成的随机字符串的内容,用来做验证的功能。用Java来制作我们的验证码 我们知道Java做网站或者B/S架构的应用程序的时候,表现层面用的都是JSP,那么,如果用java制作验证码,那么,无疑需要用JSP来呈现验证码。如果想要运行java web项目,java web 容器是必需的。因此需要说明一下运行的环境:1 Windows操作系统2 JDK1.63 Tomcat5.5再来说说用java制作验证码的思路。1无疑,使用验证码就是显示了图片。那么用html的标记就可以完成显示图片的任务。所以下面的工作就是解决img标签里面的src的路径问题了。2那么面临的任务就是如何生成一个随机显示一个字符串的图片。3 Java中我们知道有文件的输入输出流,同样的也有图像的输入输出流。那么我们就可以利用图像的输出流来输出我们通过程序在内存中画的流。4而如何访问内存中的图像数据缓冲区,那么就需要一个BufferedImage类了。通过这个类的getGraphics()方法,就可以生成一个Graphics类的对象,有了Graphics类的对象,我们就可以在图像数据缓冲区中画各种的图形图像了。最后画字符串的方法就是Graphics类中的drawString()方法。5最后输出我们图像缓冲区的内容,一张验证码就制作好了。需要注意的一点就是我们输出验证码的方式是通过javax.imageio.ImageWriter这个类的write()方法输出我们的图像,他的功能有点想我们经常在JSP页面中用的隐式对象out的类型PrintWriter。同样也是输出内容到我们的页面上。6最后我们需要把验证码的值放入session之中,这样就可以方面的在每一次独立的回话中取到验证码的值。以用来做验证,看输入的验证码是否正确。下面演示一个Servlet制作验证码的例子:Servlet类的代码:package org.xawl.jsj;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Iterator;import javax.imageio.IIOImage;import javax.imageio.ImageIO;import javax.imageio.ImageTypeSpecifier;import javax.imageio.ImageWriteParam;import javax.imageio.ImageWriter;import javax.imageio.stream.ImageOutputStream;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class ValidateCodeServlet extends HttpServlet /将来存放验证码值的session的key值 public static final String VALIDATE_CODE_KEY = ValidateCode; /请求servlet的时的被调方法 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /设置文档的内容类型为jpeg类型,/从而在浏览的时候告知浏览器这是一个图片类型response.setContentType(image/jpeg); /生成验证码,保存在session中 HttpSession session = request.getSession();/调用下面的generateString方法,/生成一个4位长的每位为0-9的随机字符串 String code = generateString(); session.setAttribute(VALIDATE_CODE_KEY, code); /生出内存图片 BufferedImage image = generateImage(code); /输出图片 outputImage(image, response.getOutputStream(); /往页面输出的方法 private void outputImage(BufferedImage image, ServletOutputStream out) throws IOException ImageWriter writer = null; /下面进行对图片格式的一些修改 ImageTypeSpecifier type =ImageTypeSpecifier.createFromRenderedImage(image); Iterator iter = ImageIO.getImageWriters(type, jpg); if (iter.hasNext() writer = (ImageWriter) iter.next(); IIOImage iioImage = new IIOImage(image, null, null); ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); /控制图片质量,1.0最高 param.setCompressionQuality(1.0F); /创建输出流 ImageOutputStream outputStream = ImageIO.createImageOutputStream(out); /将构建好的图片输出流写入到页面中 writer.setOutput(outputStream); writer.write(null, iioImage, param); /用来生成随机字符串的方法private String generateString() int a = (int) (Math.random() * 10); int b = (int) (Math.random() * 10); int c = (int) (Math.random() * 10); int d = (int) (Math.random() * 10); return + a + b + c + d; /生成图片的方法 private BufferedImage generateImage(String code) /设置图片信息,宽,高,具有 8 位 RGB 颜色分量的图像 BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB); /得到画笔 Graphics g = image.getGraphics(); /产生背景图片 g.setColor(Color.white); /画一个矩形框 g.fillRect(1, 1, 98, 28); /添加一些干扰的线条 for (int i = 0; i 20; i+) g.setColor(generateColor(); int x1 = (int) (Math.random() * 100); int y1 = (int) (Math.random() * 30); int x2 = (int) (Math.random() * 100); int y2 = (int) (Math.random() * 30); g.drawLine(x1, y1, x2, y2); /画数字 /为了得到不同效果的随机字符串,这里采用一个一个字符串的画。 /这样可以使其颜色或者其他信息有所不同 g.setFont(new Font(IMPACT, Font.PLAIN, 20 + (int) (Math.random() * 10); g.setColor(generateColor(); g.drawString(code.charAt(0) + , 5, 28); g.setFont(new Font(IMPACT, Font.PLAIN, 20 + (int) (Math.random() * 10); g.setColor(generateColor(); g.drawString(code.charAt(1) + , 30, 28); g.setFont(new Font(IMPACT, Font.PLAIN, 20 + (int) (Math.random() * 10); g.setColor(generateColor(); g.drawString(code.charAt(2) + , 55, 28); g.setFont(new Font(IMPACT, Font.PLAIN, 20 + (int) (Math.random() * 10); g.setColor(generateColor(); g.drawString(code.charAt(3) + , 80, 28); return image;/返回制作好的图像 /生成随机的颜色 private Color generateColor() int r = (int) (Math.random() * 180); int g = (int) (Math.random() * 180); int b = (int) (Math.random() * 180); return new Color(r, g, b); Servlet在web.xml中的配置: This is the description of my J2EE component This is the display name of my J2EE component ValidateCodeServlet org.xawl.jsj.ValidateCodeServlet ValidateCodeServlet /servlet/validatecode显示验证码的页面:页面代码 function change() var imgcode = document.get

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论