0601 生成验证码

来源:互联网 发布:mac自动刷新功能 编辑:程序博客网 时间:2024/06/06 09:09

1. 前言

这个主要是验证码功能, 防止客户端使用代码不断的进行发帖操作 [占用服务器资源, 发布无用的信息]
这个作品主要来自于这位网友, 我不过是将这位网友的代码进行’规范化’了一下, 提取了一个生成验证码的方法
。。后面的绘制到窗口的效果是我做的
原文 : http://blog.csdn.net/lovingshu/article/details/6945932

方法声明
public static BufferedImage getCheckCode(int width, int height, Color bgColor, Font font, int validateCodeLength, List< Character> checkCodes, int minInterference, int interferenceOff)

其思路如下 : 创建一个宽高为width, height的BufferedImage, 然后配置其背景, 字体, 然后随机生成validateLength个checkCodes中的字符, 然后随机颜色的绘制到Image上面, 然后绘制n[至少minInterference, 偏移interferenceOff]条干扰线

核心代码

/** * file name : Test02GetCheckCode.java * created at : 4:29:34 PM Nov 8, 2015 * created by 970655147 */package com.hx.test08;public class Test02GetCheckCode {    /*    自我补充篇之java随机验证码的生成    Goal:利用java代码生成随机验证码的图片(今天终于想起写这个了)!    我的验证码的优势:每个字母的颜色不同~,大小写字母数字混合,干扰线无规律,颜色也不同!    缺点:有点传统    */    /*    Author:Lovingshu's Forever    Date:2011-11-08 22:34    Remark:Suddenly,I think up that my hobby is programming~not gaming!    */    // 来自 : http://blog.csdn.net/lovingshu/article/details/6945932    public static void main(String[] lovingshu){        //Create a image in RAM        //get the paint of the image in RAM        //seed of random        //fill the background        //the String of code        // 验证码的宽高, 验证码的长度        int width = 200;        int height = 100;        int validateCodeLength = 4;        // 最小的干扰线个数, 干扰线的个数的偏差, 背景颜色, 字体, 备选的验证码数据, 验证码可取的数据的长度        int minInterference = 5;        int interferenceOff = 5;        Color bgColor = Color.WHITE;        Font font = new Font("微软雅黑", Font.ITALIC, 40);        List<Character> checkCodes = new ArrayList<>(48);        initCheckCodes(checkCodes);        int checkCodeBackUpSize = checkCodes.size();        BufferedImage bufImage = getCheckCode(width, height, bgColor, font, validateCodeLength, checkCodes, minInterference, interferenceOff);        // out put the image [save to the file !]//      try {//          /*//          *if you want it be output at the Client,do as follows://          *ImageIO.write(bufImage,"JPEG",response.getOutputStream());//          *///          File dstFile = new File(Tools.getTmpPath(30, Tools.PNG) );//this is the path//          ImageIO.write(bufImage,"jpeg",dstFile);//          if(dstFile.exists()){//              System.out.println("Success!");//          }else{//              System.out.println("Failed!");//          }//      } catch (IOException e) {//          e.printStackTrace();//      }finally{//          System.out.println("Lovingshu's Forever");//      }        // paint it !        new MyFrame(bufImage);    }    // 生成验证码图片        // checkCodeY 为验证码距离顶上的偏移, checkCodeXOff 表示每两个验证数据之间的x方向上的偏移        // 新建Image, 配置graphics        // 获取随机的validateLength个字符[颜色随机], 绘制到Image上        // 随机绘制干扰线 [至少minInterference, 个数偏差在[0, interferenceOff) ] [颜色随机]    public static BufferedImage getCheckCode(int width, int height, Color bgColor, Font font, int validateCodeLength, List<Character> checkCodes, int minInterference, int interferenceOff) {        int checkCodeY = height - (height >> 2);        int checkCodeXOff = width / (validateCodeLength+2);        BufferedImage bufImage = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);        Graphics g = bufImage.getGraphics();        g.setColor(bgColor);        g.fillRect(0, 0, width, height);        g.setFont(font);        StringBuilder validateCode = new StringBuilder();        while(validateCode.length() < validateCodeLength){            g.setColor(randomColor() );            Character curChar = checkCodes.get(random(checkCodes.size()) );            g.drawString(curChar.toString(), (validateCode.length() + 1) * checkCodeXOff, checkCodeY);            validateCode.append(curChar );        }        //draw the interference line        int interferenceSize = (ran.nextInt(interferenceOff) + minInterference);        for(int i = 0; i < interferenceSize; i++){            g.setColor(randomColor() );            g.drawLine(random(width), random(height), random(width), random(height));        }           return bufImage;    }    // 初始化checkCodes [0-9 & a-z & A-Z]    private static void initCheckCodes(List<Character> checkCodes) {        for(char i='0'; i<'9'; i++) {            checkCodes.add(i);        }        for(char i='a'; i<'z'; i++) {            checkCodes.add(i);        }        for(char i='A'; i<'Z'; i++) {            checkCodes.add(i);        }    }    // random 对象    static Random ran = new Random();    // 获取给定范围内的随机数    public static int random(int range) {        return ran.nextInt(range);    }    // 获取一个随机的颜色    public static Color randomColor() {        return new Color(random(255)+1, random(255)+1, random(255)+1);    }    // 绘制窗口    static class MyFrame extends JFrame {        // 窗口的宽高        static int FRAMEWIDTH = 300;        static int FRAMEHEIGHT = 200;        // 初始化        public MyFrame(BufferedImage bufImage) {            add(new MyPanel(bufImage));            this.setVisible(true);            this.setBounds(100, 100, FRAMEWIDTH, FRAMEHEIGHT);            this.setTitle("CheckCode");            this.setDefaultCloseOperation(EXIT_ON_CLOSE);            this.setResizable(false);        }    }    // 绘制面板    static class MyPanel extends JPanel {        // 需要绘制的图片        private BufferedImage bufImage;        // 初始化        public MyPanel(BufferedImage bufImage) {            this.bufImage = bufImage;        }        @Override        public void paint(Graphics g) {            g.drawImage(bufImage, 0, 0, this);        }    }}

效果
这里写图片描述

这里写图片描述

这里写图片描述

参考
http://blog.csdn.net/lovingshu/article/details/6945932

0 0
原创粉丝点击