zoukankan      html  css  js  c++  java
  • 生成验证码效果

    生成验证码效果

     

     

     

     

    ValidateCode.java 验证码生成类

    Java代码  收藏代码
    1. package cn.dsna.util.images;  
    2.   
    3. import java.awt.Color;  
    4. import java.awt.Font;  
    5. import java.awt.Graphics2D;  
    6. import java.awt.image.BufferedImage;  
    7. import java.io.FileOutputStream;  
    8. import java.io.IOException;  
    9. import java.io.OutputStream;  
    10. import java.util.Random;  
    11.   
    12. import javax.imageio.ImageIO;  
    13. /** 
    14.  * 验证码生成器 
    15.  * @author dsna 
    16.  * 
    17.  */  
    18. public class ValidateCode {  
    19.     // 图片的宽度。  
    20.     private int width = 160;  
    21.     // 图片的高度。  
    22.     private int height = 40;  
    23.     // 验证码字符个数  
    24.     private int codeCount = 5;  
    25.     // 验证码干扰线数  
    26.     private int lineCount = 150;  
    27.     // 验证码  
    28.     private String code = null;  
    29.     // 验证码图片Buffer  
    30.     private BufferedImage buffImg=null;  
    31.   
    32.     private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',  
    33.             'K', 'L', 'M', 'N',  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',  
    34.             'X', 'Y', 'Z',  '1', '2', '3', '4', '5', '6', '7', '8', '9' };  
    35.   
    36.     public  ValidateCode() {  
    37.         this.createCode();  
    38.     }  
    39.   
    40.     /** 
    41.      *  
    42.      * @param width 图片宽 
    43.      * @param height 图片高 
    44.      */  
    45.     public  ValidateCode(int width,int height) {  
    46.         this.width=width;  
    47.         this.height=height;  
    48.         this.createCode();  
    49.     }  
    50.     /** 
    51.      *  
    52.      * @param width 图片宽 
    53.      * @param height 图片高 
    54.      * @param codeCount 字符个数 
    55.      * @param lineCount 干扰线条数 
    56.      */  
    57.     public  ValidateCode(int width,int height,int codeCount,int lineCount) {  
    58.         this.width=width;  
    59.         this.height=height;  
    60.         this.codeCount=codeCount;  
    61.         this.lineCount=lineCount;  
    62.         this.createCode();  
    63.     }  
    64.       
    65.     public void createCode() {  
    66.         int x = 0,fontHeight=0,codeY=0;  
    67.         int red = 0, green = 0, blue = 0;  
    68.           
    69.         x = width / (codeCount +2);//每个字符的宽度  
    70.         fontHeight = height - 2;//字体的高度  
    71.         codeY = height - 4;  
    72.           
    73.         // 图像buffer  
    74.         buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);  
    75.         Graphics2D g = buffImg.createGraphics();  
    76.         // 生成随机数  
    77.         Random random = new Random();  
    78.         // 将图像填充为白色  
    79.         g.setColor(Color.WHITE);  
    80.         g.fillRect(0, 0, width, height);  
    81.         // 创建字体  
    82.         ImgFontByte imgFont=new ImgFontByte();  
    83.         Font font =imgFont.getFont(fontHeight);  
    84.         g.setFont(font);  
    85.           
    86.         for (int i = 0; i < lineCount; i++) {  
    87.             int xs = random.nextInt(width);  
    88.             int ys = random.nextInt(height);  
    89.             int xe = xs+random.nextInt(width/8);  
    90.             int ye = ys+random.nextInt(height/8);  
    91.             red = random.nextInt(255);  
    92.             green = random.nextInt(255);  
    93.             blue = random.nextInt(255);  
    94.             g.setColor(new Color(red, green, blue));  
    95.             g.drawLine(xs, ys, xe, ye);  
    96.         }  
    97.           
    98.         // randomCode记录随机产生的验证码  
    99.         StringBuffer randomCode = new StringBuffer();  
    100.         // 随机产生codeCount个字符的验证码。  
    101.         for (int i = 0; i < codeCount; i++) {  
    102.             String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);  
    103.             // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。  
    104.             red = random.nextInt(255);  
    105.             green = random.nextInt(255);  
    106.             blue = random.nextInt(255);  
    107.             g.setColor(new Color(red, green, blue));  
    108.             g.drawString(strRand, (i + 1) * x, codeY);  
    109.             // 将产生的四个随机数组合在一起。  
    110.             randomCode.append(strRand);  
    111.         }  
    112.         // 将四位数字的验证码保存到Session中。  
    113.         code=randomCode.toString();       
    114.     }  
    115.       
    116.     public void write(String path) throws IOException {  
    117.         OutputStream sos = new FileOutputStream(path);  
    118.             this.write(sos);  
    119.     }  
    120.       
    121.     public void write(OutputStream sos) throws IOException {  
    122.             ImageIO.write(buffImg, "png", sos);  
    123.             sos.close();  
    124.     }  
    125.     public BufferedImage getBuffImg() {  
    126.         return buffImg;  
    127.     }  
    128.       
    129.     public String getCode() {  
    130.         return code;  
    131.     }  
    132. }  

    ImgFontByte.java

    Java代码  收藏代码
    1. package cn.dsna.util.images;  
    2. import java.io.ByteArrayInputStream;  
    3. import java.awt.*;  
    4. /** 
    5.  * ttf字体文件 
    6.  * @author dsna 
    7.  * 
    8.  */  
    9. public class ImgFontByte {  
    10.     public Font getFont(int fontHeight){  
    11.         try {  
    12.             Font baseFont = Font.createFont(Font.TRUETYPE_FONT, new ByteArrayInputStream(hex2byte(getFontByteStr())));  
    13.             return baseFont.deriveFont(Font.PLAIN, fontHeight);  
    14.         } catch (Exception e) {  
    15.             return new Font("Arial",Font.PLAIN, fontHeight);  
    16.         }  
    17.     }  
    18.       
    19.     private  byte[] hex2byte(String str) {   
    20.         if (str == null)  
    21.             return null;  
    22.         str = str.trim();  
    23.         int len = str.length();  
    24.         if (len == 0 || len % 2 == 1)  
    25.             return null;  
    26.   
    27.         byte[] b = new byte[len / 2];  
    28.         try {  
    29.             for (int i = 0; i < str.length(); i += 2) {  
    30.                 b[i / 2] = (byte) Integer  
    31.                         .decode("0x" + str.substring(i, i + 2)).intValue();  
    32.             }  
    33.             return b;  
    34.         } catch (Exception e) {  
    35.             return null;  
    36.         }  
    37.     } /** 
    38.   * ttf字体文件的十六进制字符串 
    39.   * @return 
    40.   */  
    41.  private String getFontByteStr(){ return null;  
    42.         return str;//字符串太长 在附件中找  
    43. }  
    44. }  

     ValidateCodeServlet.java Servlet调用方法 

    Java代码  收藏代码
    1. package cn.dsna.util.images;  
    2.   
    3. import java.io.IOException;  
    4. import javax.servlet.ServletException;  
    5. import javax.servlet.http.HttpServlet;  
    6. import javax.servlet.http.HttpServletRequest;  
    7. import javax.servlet.http.HttpServletResponse;  
    8. import javax.servlet.http.HttpSession;  
    9.   
    10. public class ValidateCodeServlet extends HttpServlet {  
    11.     private static final long serialVersionUID = 1L;  
    12.   
    13.     @Override  
    14.     protected void doGet(HttpServletRequest reqeust,  
    15.             HttpServletResponse response) throws ServletException, IOException {  
    16.         // 设置响应的类型格式为图片格式  
    17.         response.setContentType("image/jpeg");  
    18.         //禁止图像缓存。  
    19.         response.setHeader("Pragma", "no-cache");  
    20.         response.setHeader("Cache-Control", "no-cache");  
    21.         response.setDateHeader("Expires", 0);  
    22.           
    23.         HttpSession session = reqeust.getSession();  
    24.           
    25.         ValidateCode vCode = new ValidateCode(120,40,5,100);  
    26.         session.setAttribute("code", vCode.getCode());  
    27.         vCode.write(response.getOutputStream());  
    28.     }  
    29. /** 
    30.  * web.xml 添加servlet 
    31.     <servlet> 
    32.         <servlet-name>validateCodeServlet</servlet-name> 
    33.         <servlet-class>cn.dsna.util.images.ValidateCodeServlet</servlet-class> 
    34.     </servlet>     
    35.     <servlet-mapping> 
    36.         <servlet-name>validateCodeServlet</servlet-name> 
    37.         <url-pattern>*.images</url-pattern> 
    38.     </servlet-mapping> 
    39.  
    40. 在地址栏输入XXX/dsna.images 测试 
    41.  */  
    42.   
    43. }  

     测试类

    ValidateCodeTest.java

    Java代码  收藏代码
    1. package cn.dsna.util.images;  
    2.   
    3. import java.io.IOException;  
    4. import java.util.Date;  
    5.   
    6. public class ValidateCodeTest {  
    7.   
    8.     /** 
    9.      * @param args 
    10.      */  
    11.     public static void main(String[] args) {  
    12.         ValidateCode vCode = new ValidateCode(120,40,5,100);  
    13.         try {  
    14.             String path="D:/t/"+new Date().getTime()+".png";  
    15.             System.out.println(vCode.getCode()+" >"+path);  
    16.             vCode.write(path);  
    17.         } catch (IOException e) {  
    18.             e.printStackTrace();  
    19.         }  
    20.     }  
    21.   
    22. }  

    web.xml 配置

    Xml代码  收藏代码
    1. <servlet>  
    2.     <servlet-name>validateCodeServlet</servlet-name>  
    3.     <servlet-class>cn.dsna.util.images.ValidateCodeServlet</servlet-class>  
    4. </servlet>      
    5. <servlet-mapping>  
    6.     <servlet-name>validateCodeServlet</servlet-name>  
    7.     <url-pattern>*.images</url-pattern>  
    8. </servlet-mapping>  
    每天学习一点点,你就进步一点点。
  • 相关阅读:
    linux 终端光标消失问题
    linux系统中条件测试语句
    linux shell if语句
    linux shell for循环
    linux 系统中read命令
    linux中while循环语句
    linux shell脚本中流程控制语句 if 、for、while、case
    pc端WINCE的安装包
    WinCE程序的几种开发方法
    Wince 下开发技巧(一)查看内存
  • 原文地址:https://www.cnblogs.com/zhangliang88/p/5331273.html
Copyright © 2011-2022 走看看