首页 > 代码库 > java web验证码生成总结(包括servlet、jsp和struts2实现)(转)

java web验证码生成总结(包括servlet、jsp和struts2实现)(转)

一、使用纯Servlet实现验证码

(1)在web.xml配置: 

[java] view plaincopy

  1. <servlet>     

  2.     <servlet-name>image</servlet-name>     

  3.     <servlet-class>org.test.web.AuthImage</servlet-class>     

  4. </servlet>     

  5.     

  6. <servlet-mapping>     

  7.     <servlet-name>image</servlet-name>     

  8.  <url-pattern>/authImage</url-pattern>     

  9. </servlet-mapping>    

(2)servlet源码

[java] view plaincopy

  1. public class AuthImage extends HttpServlet     

  2. {     

  3.     

  4.     private static final String CONTENT_TYPE = "text/html; charset=gb2312";     

  5.     //设置字母的大小,大小     

  6.     private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);     

  7.     public void init() throws ServletException     

  8.     {     

  9.         super.init();     

  10.     }     

  11.     Color getRandColor(int fc,int bc)     

  12.     {     

  13.         Random random = new Random();     

  14.         if(fc>255) fc=255;     

  15.         if(bc>255) bc=255;     

  16.         int r=fc+random.nextInt(bc-fc);     

  17.         int g=fc+random.nextInt(bc-fc);     

  18.         int b=fc+random.nextInt(bc-fc);     

  19.         return new Color(r,g,b);     

  20.     }     

  21.     

  22.     public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException     

  23.     {     

  24.         response.setHeader("Pragma","No-cache");     

  25.         response.setHeader("Cache-Control","no-cache");     

  26.         response.setDateHeader("Expires"0);     

  27.         //表明生成的响应是图片     

  28.         response.setContentType("image/jpeg");     

  29.              

  30.         int width=100, height=18;     

  31.         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);     

  32.              

  33.         Graphics g = image.getGraphics();     

  34.         Random random = new Random();     

  35.         g.setColor(getRandColor(200,250));     

  36.         g.fillRect(11, width-1, height-1);     

  37.         g.setColor(new Color(102,102,102));     

  38.         g.drawRect(00, width-1, height-1);     

  39.         g.setFont(mFont);     

  40.     

  41.         g.setColor(getRandColor(160,200));     

  42.     

  43.         //画随机线     

  44.         for (int i=0;i<155;i++)     

  45.         {     

  46.             int x = random.nextInt(width - 1);     

  47.             int y = random.nextInt(height - 1);     

  48.             int xl = random.nextInt(6) + 1;     

  49.             int yl = random.nextInt(12) + 1;     

  50.             g.drawLine(x,y,x + xl,y + yl);     

  51.         }     

  52.     

  53.         //从另一方向画随机线     

  54.         for (int i = 0;i < 70;i++)     

  55.         {     

  56.             int x = random.nextInt(width - 1);     

  57.             int y = random.nextInt(height - 1);     

  58.             int xl = random.nextInt(12) + 1;     

  59.             int yl = random.nextInt(6) + 1;     

  60.             g.drawLine(x,y,x - xl,y - yl);     

  61.         }     

  62.     

  63.         //生成随机数,并将随机数字转换为字母     

  64.         String sRand="";     

  65.         for (int i=0;i<6;i++)     

  66.         {     

  67.             int itmp = random.nextInt(26) + 65;     

  68.             char ctmp = (char)itmp;     

  69.             sRand += String.valueOf(ctmp);     

  70.             g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));     

  71.             g.drawString(String.valueOf(ctmp),15*i+10,16);     

  72.         }     

  73.     

  74.         HttpSession session = request.getSession(true);     

  75.         session.setAttribute("rand",sRand);     

  76.         g.dispose();     

  77.         ImageIO.write(image, "JPEG", response.getOutputStream());     

  78.     }     

  79.     public void destroy()     

  80.     {     

  81.     }     

  82. }    

(3)页面显示

[java] view plaincopy

  1. <img src=http://www.mamicode.com/"authImage"/>   

 

 

 

二、使用纯jsp实现验证码

[java] view plaincopy

  1. <%@ page language="java" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"   

  2.      contentType="image/jpeg" pageEncoding="UTF-8"%>  

  3.   

  4.   

  5. <%  //设置页面不缓存  

  6.    response.setHeader("Pragma","No-cache");  

  7.    response.setHeader("Cahce-Control","no-cache");  

  8.    response.setDateHeader("Expires",0);  

  9.    //在内存中创建图片  

  10.    int width=60,height=20;  

  11.    BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);  

  12.    //获取图形上下文  

  13.    Graphics g= image.getGraphics();  

  14.    //生成随机类  

  15.    Random random= new Random();  

  16.    //设置背景颜色  

  17.    g.setColor(new Color(160,200,100));  

  18.    g.fillRect(0,0,width,height);  

  19.    //设置字体  

  20.    g.setFont(new Font("Times New Roman",Font.PLAIN,18));  

  21.    //随机产生50条干扰线,使图形中的验证码不易被其他的程序探测到  

  22.     g.setColor(new Color(160,200,200));  

  23.    for(int i=0;i<50;i++)  

  24.    {  

  25.      int x=random.nextInt(width);  

  26.      int y=random.nextInt(height);  

  27.      int x1=random.nextInt(width);  

  28.      int y1=random.nextInt(height);  

  29.      g.drawLine(x,y,x+x1,y+y1);  

  30.    }  

  31.    //随机产生验证码(6位数字)  

  32.    String sRand="";  

  33.    for(int i=0;i<6;i++)  

  34.    {  

  35.      String rand=String.valueOf(random.nextInt(10));  

  36.      sRand+=rand;  

  37.      //将验证码显示到图象  

  38.      g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));  

  39.      g.drawString(rand,13*i+6,16);  

  40.    }  

  41.    session.setAttribute("rand",sRand);  //////将产生的验证码存储到sesson中  

  42.    g.dispose();  

  43.    ImageIO.write(image,"JPEG",response.getOutputStream());  

  44.    out.clear(); //***********  

  45.    out=pageContext.pushBody();//**********  

  46.  %>  

 

 

三、使用Struts2来实现验证码

(1)定义一个生成验证码的工具类

[java] view plaincopy

  1. package com.cn.hospital.util;  

  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.ByteArrayInputStream;     

  8. import java.io.ByteArrayOutputStream;     

  9. import java.util.Random;     

  10. import javax.imageio.ImageIO;     

  11. import javax.imageio.stream.ImageOutputStream;     

  12.   

  13. public class RandomNumUtil {  

  14.   

  15.     private ByteArrayInputStream image;//图像      

  16.     private String str;//验证码      

  17.         

  18.     private RandomNumUtil(){      

  19.     init();//初始化属性      

  20.     }      

  21.     /*    

  22.     * 取得RandomNumUtil实例    

  23.     */      

  24.     public static RandomNumUtil Instance(){      

  25.     return new RandomNumUtil();      

  26.     }      

  27.     /*    

  28.     * 取得验证码图片    

  29.     */      

  30.     public ByteArrayInputStream getImage(){      

  31.     return this.image;      

  32.     }      

  33.     /*    

  34.     * 取得图片的验证码    

  35.     */      

  36.     public String getString(){      

  37.     return this.str;      

  38.     }      

  39.         

  40.     private void init() {      

  41.     // 在内存中创建图象      

  42.     int width=85, height=20;      

  43.     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);      

  44.     // 获取图形上下文      

  45.     Graphics g = image.getGraphics();      

  46.     // 生成随机类      

  47.     Random random = new Random();      

  48.     // 设定背景色      

  49.     g.setColor(getRandColor(200,250));      

  50.     g.fillRect(00, width, height);      

  51.     // 设定字体      

  52.     g.setFont(new Font("Times New Roman",Font.PLAIN,18));      

  53.     // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到      

  54.     g.setColor(getRandColor(160,200));      

  55.     for (int i=0;i<155;i++)      

  56.     {      

  57.     int x = random.nextInt(width);      

  58.     int y = random.nextInt(height);      

  59.     int xl = random.nextInt(12);      

  60.     int yl = random.nextInt(12);      

  61.     g.drawLine(x,y,x+xl,y+yl);      

  62.     }      

  63.     // 取随机产生的认证码(6位数字)      

  64.     String sRand="";      

  65.     for (int i=0;i<6;i++){      

  66.     String rand=String.valueOf(random.nextInt(10));      

  67.     sRand+=rand;      

  68.     // 将认证码显示到图象中      

  69.     g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));      

  70.     // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成      

  71.     g.drawString(rand,13*i+6,16);      

  72.     }     

  73.     //赋值验证码     

  74.     this.str=sRand;      

  75.         

  76.     //图象生效      

  77.     g.dispose();      

  78.     ByteArrayInputStream input=null;      

  79.     ByteArrayOutputStream output = new ByteArrayOutputStream();      

  80.     try{      

  81.     ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);      

  82.     ImageIO.write(image, "JPEG", imageOut);      

  83.     imageOut.close();      

  84.     input = new ByteArrayInputStream(output.toByteArray());      

  85.     }catch(Exception e){      

  86.     System.out.println("验证码图片产生出现错误:"+e.toString());      

  87.     }      

  88.         

  89.     this.image=input;/* 赋值图像 */      

  90.     }      

  91.     /*    

  92.     * 给定范围获得随机颜色    

  93.     */      

  94.     private Color getRandColor(int fc,int bc){      

  95.     Random random = new Random();      

  96.     if(fc>255) fc=255;      

  97.     if(bc>255) bc=255;      

  98.     int r=fc+random.nextInt(bc-fc);      

  99.     int g=fc+random.nextInt(bc-fc);      

  100.     int b=fc+random.nextInt(bc-fc);      

  101.     return new Color(r,g,b);      

  102.     }     

  103. }  

(2)定义一个验证码输出的action

[java] view plaincopy

  1. package com.cn.hospital.action;  

  2.   

  3. import java.io.ByteArrayInputStream;  

  4. import java.io.ByteArrayOutputStream;  

  5.   

  6. import org.springframework.context.annotation.Scope;  

  7. import org.springframework.stereotype.Controller;  

  8.   

  9. import com.cn.hospital.util.RandomCharUtil;  

  10. import com.cn.hospital.util.RandomNumUtil;  

  11. import com.opensymphony.xwork2.ActionContext;  

  12. import com.opensymphony.xwork2.ActionSupport;  

  13.   

  14. @Controller ("utilAction")  

  15. @Scope("prototype")  

  16. public class UtilAction extends ActionSupport{  

  17.       

  18.     private static final long serialVersionUID = -7193209177116825032L;  

  19.     private ByteArrayInputStream inputStream;   

  20.       

  21.     private int width;     

  22.     private int height;     

  23.     private int fontSize;     

  24.     private int codeLength;   

  25.     private int disturbType;  

  26.       

  27.     public String validNumGenerate() throws Exception{  

  28.         RandomNumUtil rdnu=RandomNumUtil.Instance();      

  29.         this.setInputStream(rdnu.getImage());//取得带有随机字符串的图片      

  30.         ActionContext.getContext().getSession().put("random", rdnu.getString());//取得随机字符串放入HttpSession      

  31.         return SUCCESS;      

  32.     }   

  33.       

  34.       

  35.     public void setInputStream(ByteArrayInputStream inputStream) {      

  36.         this.inputStream = inputStream;      

  37.     }     

  38.       

  39.     public ByteArrayInputStream getInputStream() {      

  40.         return inputStream;      

  41.     }  

  42.       

  43.   

  44. }  

(3)struts.xml配置

[java] view plaincopy

  1. <!-- 产生随机验证码 -->  

  2.         <action name="randNum" class="utilAction" method="validNumGenerate">        

  3.            <result name="success" type="stream">        

  4.                 <param name="contentType">image/jpeg</param>        

  5.                 <param name="inputName">inputStream</param>        

  6.            </result>     

  7.         </action>   

 

 

四、小结

    对于java的web技术,归根究底还是在服务器端执行的servlet.从上面的三种不同实现中,我们很容易察觉到他们存在一个共同点,那就是返回浏览器端的contentType。

    servlet:使用response.setContentType(" ");方法来实现

    jsp:在<@ page contentType=" ">中来实现

    struts2:通过配置<param name="contentType"> </param>来实现

 

至于验证码的产生其实比较简单,在这里就不深究了。就此一点小感想,与同行共勉。