Jsp常用技巧图片验证码_第1页
Jsp常用技巧图片验证码_第2页
Jsp常用技巧图片验证码_第3页
Jsp常用技巧图片验证码_第4页
Jsp常用技巧图片验证码_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、Jsp常用技巧:图片验证码2007-12-28 21:08:09 已被阅读: 371 发表评论思路:图片验证码的实现主要的技术点是如何生成一个图片。生成图片可以使用java.awt包下的类来实现。我们先写一个简单的生成图片的程序HelloImage.java。以下是代码部分。 package com.vogoal.test;import java.awt.Color;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import

2、javax.imageio.ImageIO;/* author SinNeR * create a image*/public class HelloImage public static void main(String args)BufferedImage image = new BufferedImage(80, 25,BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();g.setColor(new Color(255,255,255);g.fillRect(0, 0, 80, 25);g.setColor(new C

3、olor(0,0,0);g.drawString("HelloImage",6,16); g.dispose();tryImageIO.write(image, "jpeg", new File("C:helloImage.jpeg");catch(IOException e)e.printStackTrace(); 编译后,在DOS下调用这个程序,正常情况下,会在C盘根目录下生成一张名字helloImage.jpeg为的图片。图片上有文字HelloImage。 简单介绍下生成图片的流程: 1. 建立BufferedImage对象。指

4、定图片的长度宽度和色彩。BufferedImage image = new BufferedImage(80,25,BufferedImage.TYPE_INT_RGB); 2. 取得Graphics对象,用来绘制图片。Graphics g = image.getGraphics(); 3. 绘制图片背景和文字。 4. 释放Graphics对象所占用的资源。g.dispose(); 5. 通过ImageIO对象的write静态方法将图片输出。ImageIO.write(image, "jpeg", new File("C:helloImage.jpeg"

5、); 知道了图片的生成方法,剩下的问题就是如何将随机数生成到页面上了。要显示图片,我们只要将生成的图片流返回给response对象,这样用户请求的时候就可以得到图片。而一个jsp页面的page参数的contentType属性可以指定返回的response对象的形式,我们平时的jsp页面中设定的contentType是text/html,所以会被以HTML文件的形式读取分析。如果设定为image/jpeg,就会被以图片的形式读取分析。确定了这点后就可以着手实现。 1. 修改生成图片的类,添加生成随机字符串的方法,并取得用户传过来的response对象将图片流输出到response对象中。同时为了

6、更友好和可订制,添加了一个构造函数,可以修改图片验证码的长度,以及验证码的码字范围。并且可以设定验证码的背景色。(用户使用时可以设定验证图片的背景色与页面的背景色相同) 2. 写一个jsp文件,用来调用生成验证码图片的类。并得到生成的验证码,存入session。 以下是生成验证码图片的类RandImgCreater。(操作系统的原因,没有写注释,避免乱码) package com.vogoal.util.img;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.Bu

7、fferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletResponse;/* author SinNeR* * image check creater*/public class RandImgCreater private static final String CODE_LIST = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu

8、vwxyz1234567890"private HttpServletResponse response = null;private static final int HEIGHT = 20;private static final int FONT_NUM = 4;private int width = 0;private int iNum = 0;private String codeList = ""private boolean drawBgFlag = false;private int rBg = 0;private int gBg = 0;priv

9、ate int bBg = 0;public RandImgCreater(HttpServletResponse response) this.response = response;this.width = 13 * FONT_NUM + 12;this.iNum = FONT_NUM;this.codeList = CODE_LIST;public RandImgCreater(HttpServletResponse response,int iNum,String codeList) this.response = response;this.width = 13 * iNum + 1

10、2;this.iNum = iNum;this.codeList = codeList; public String createRandImage()BufferedImage image = new BufferedImage(width, HEIGHT,BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();Random random = new Random();if ( drawBgFlag )g.setColor(new Color(rBg,gBg,bBg);g.fillRect(0, 0, width, HEIGH

11、T);elseg.setColor(getRandColor(200, 250); g.fillRect(0, 0, width, HEIGHT);for (int i = 0; i < 155; i+) g.setColor(getRandColor(140, 200);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); g.setFont

12、(new Font("Times New Roman", Font.PLAIN, 18);String sRand=""for (int i=0;i<iNum;i+)int rand=random.nextInt(codeList.length();String strRand=codeList.substring(rand,rand+1);sRand+=strRand;g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110);

13、g.drawString(strRand,13*i+6,16); g.dispose();tryImageIO.write(image, "JPEG", response.getOutputStream();catch(IOException e)return sRand;public void setBgColor(int r,int g,int b)drawBgFlag = true;this.rBg = r;this.gBg = g;this.bBg = b;private Color getRandColor(int fc, int bc) Random rando

14、m = new Random();if (fc > 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);以下是调用生成验证码图片的类的jsp文件:<% page contentType="image/jpeg" import="com.vogoal.util.

15、img.*" %><%response.setHeader("Pragma","No-cache");response.setHeader("Cache-Control","no-cache");response.setDateHeader("Expires", 0);RandImgCreater rc = new RandImgCreater(response);/RandImgCreater rc = new RandImgCreater(response,8,&quo

16、t;abcdef");/rc.setBgColor(100,100,100);String rand = rc.createRandImage();session.setAttribute("rand",rand);%> 将java程序编译后得到的class,放到Tomcat自己的web应用的class的目录下,并写一个测试程序。 请求页面: <form name="frm" method="post" action="chkImg.jsp">Hello Image Test<br

17、/>checkCode:<img src="img.jsp"><br/>please input the checkCode:<input type="text" name="code" value=""><br/><input type="submit" name="btn1" value="check"></form> 验证页面: <%String inputCode

18、= request.getParameter("code");String code = (String)session.getAttribute("rand");if ( inputCode.equals(code) )%>check SUCCESS!<%else%>wrong code!<%> 将所有的jsp文件放到自己的web应用的目录下。 开始测试: 启动Tomcat,访问请求页面。 填入图片上显示的验证码,点击check按钮,可以看到如下画面。测试成功。 至此,jsp的图片验证码基本实现。实际中,我们可以用java

19、的图片类实现更多的功能。如果有必要,会继续讨论实现方法。 使用帮助: 附件中提供了图片生成类和jsp文件,测试jsp文件的下载。使用过程中,可以修改img.jsp文件,从而符合自己要实现的功能要求。 1构造函数RandImgCreater提供了2个构造函数。默认的构造函数需要设定response对象。public RandImgCreater(HttpServletResponse response)使用这个构造函数的时候,生成4位验证码图片,验证码为大小写英文字母和数字中的随机组合。public RandImgCreater(HttpServletResponse response,int

20、iNum,String codeList)使用这个构造函数的时候,iNum为指定的显示的验证码的位数,codeList为用户指定的验证码的生成元字符。(不支持中文)使用例RandImgCreater rc = new RandImgCreater(response,8,"abcdef");将会生成从abcdef中随机取出的8位验证码图片。 2指定背景色public void setBgColor(int r,int g,int b)这个方法可选用。设定的时候,将会按照用户指定的背景色显示图片背景,不设定的时候将使用默认背景。r,g,b分别为RGB颜色中的各个色彩的设定值。取

21、值范围为0-255使用例rc.setBgColor(100,100,100);关键字: jsp servlet 图片验证码产生图片验证码的Servlet:Java代码 1 package web; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.image.BufferedImage; 7 import java.io.IOException; 8 import java.io.OutputStream; 9 import java.util.Ran

22、dom; 10 11 import javax.imageio.ImageIO; 12 import javax.servlet.ServletException; 13 import javax.servlet.http.HttpServlet; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 import javax.servlet.http.HttpSession; 17 18 public class ValidationCode

23、extends HttpServlet 19 20 /* 21 * 验证码的字符集合。 22 */ 23 private static String codeChars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 24 25 /* 26 * 产生随机的颜色 27 * param minColor 28 * param maxColor 29 * return 30 */ 31 private static Color getRandomColor(int minColor,int ma

24、xColor) 32 33 Random r = new Random(); 34 int red = minColor + r.nextInt(maxColor-minColor); 35 int green = minColor + r.nextInt(maxColor-minColor); 36 int blue = minColor + r.nextInt(maxColor-minColor); 37 return new Color(red,green,blue); 38 39 40 41 public void doGet(HttpServletRequest request, H

25、ttpServletResponse response) 42 throws ServletException, IOException 43 /关闭客户端浏览器的缓冲区。 44 response.setHeader("ragma", "No-cache"); 45 response.setHeader("Cache-Control", "no-cache"); 46 response.setHeader("Expirse", "0"); 47 /设置图形大小。 48 int

26、 width = 90 , height = 20; 49 /建立图形缓冲区。 50 BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 51 Graphics g = image.getGraphics();/获得 Graphics 对象。 52 g.setColor(getRandomColor(180, 250);/设置背景色。 53 g.fillRect(0, 0, width, height);/填充背景。 54 55 StringBuilder validationCod

27、e = new StringBuilder();/用于保存最后的验证码 56 String fontNames = "Times New Roman","Book antiqua","Arial"/用于随机的字体的集合 57 58 Random r = new Random(); 59 /随机生成3-5个验证码 60 for(int i = 0; i<3+r.nextInt(3); i+) 61 62 g.setFont(new Font(fontNamesr.nextInt(3) , Font.ITALIC , height)

28、; 63 char codeChar = codeChars.charAt(r.nextInt(codeChars.length(); 64 validationCode.append(codeChar); 65 g.setColor(getRandomColor(10, 100); 66 g.drawString(String.valueOf(codeChar), 16 * i+ r.nextInt(7) ,height - r.nextInt(6);/在图形上输出验证码 67 68 /随机生干扰码 69 for(int i = 0; i<30 ; i+) 70 71 g.setCol

29、or(getRandomColor(90, 200); 72 int x = r.nextInt(width); 73 int y = r.nextInt(height); 74 g.drawLine(x,y , x+r.nextInt(10), y+r.nextInt(5); 75 76 77 HttpSession session = request.getSession();/得到HttpSession对象 78 session.setMaxInactiveInterval(10*60);/设置session对象10分钟失效。 79 session.setAttribute("

30、validation_code", validationCode.toString();/将验证码保存在session中 80 g.dispose();/关闭Graphics对象 81 OutputStream os = response.getOutputStream();/得到输出流 82 ImageIO.write(image, "JPEG", os);/以JPEG格式向客户端发送图形验证码 83 84 85 86 public void doPost(HttpServletRequest request, HttpServletResponse respo

31、nse) 87 throws ServletException, IOException 88 89 doGet(request, response); 90 91 92 检测验证码是否正确的方法:Java代码 93 /* 94 * 核对用户输入的验证码是否合法 95 * 96 * param request 97 * param validationCode 98 * return 99 */ 100 private boolean checkValidationCode(HttpServletRequest request,String validationCode) 101 / 从Htt

32、pSession中获得系统随机生成的验证码 102 String validationCodeSession = (String) request.getSession().getAttribute("validation_code"); 103 / 如果获得的验证码为null,说明难码过期,必须刷新客户端重新获取 104 if (validationCodeSession = null) 105 request.setAttribute("info", "验证码过期"); 106 return false; 107 108 / 输入

33、的验证码不匹配 109 if (!validationCode.equalsIgnoreCase(validationCodeSession) 110 request.setAttribute("info", "验证码不正确!"); 111 return false; 112 113 return true; 114 JSP页面:使用图形验证码的方法非常简单,只需将“validationCode”(产生验证码的Servlet的url-pattern)作为<img>标签的src属性值即可Html代码 115 <% page languag

34、e="java" import="java.util.*" pageEncoding="UTF-8"%> 116 <% 117 String path = request.getContextPath(); 118 String basePath = request.getScheme()+":/"+request.getServerName()+":"+request.getServerPort()+path+"/" 119 %> 120 121 <!DOCTYPE HTML PUBLIC "-/W3C/DTD HTML 4.01 Transitional/EN"> 122 <html> 123 <head> 124 <base href="<%=basePath%>"> 125 <title>注册</title> 126 <script type="text/ja

温馨提示

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

评论

0/150

提交评论