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>  
    每天学习一点点,你就进步一点点。
  • 相关阅读:
    容器跨主机网络通信学习笔记(以Flannel为例)
    Kubernetes控制器Job和CronJob
    记一次使用Flannel插件排错历程
    Kubernetes控制器Deployment
    Kubernetes如何通过StatefulSet支持有状态应用?
    react18 来了,我 get 到...
    gojs 实用高级用法
    vuecli3 vue2 保留 webpack 支持 vite 成功实践
    calibre 报错 This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 解决
    unable to recognize "*.yaml": no matches for kind "RoleBinding" in version "rbac.authorization.k8s.io/v1beta1"
  • 原文地址:https://www.cnblogs.com/zhangliang88/p/5331273.html
Copyright © 2011-2022 走看看