Java工具类——随机验证码RandNumberUtils

在平常的web开发当中我们经常用到验证码,但是关于如何产生指定位数的验证码一直没有深入的去了解,都是要用的时候就去写。在上一次开发当中我就将这个经验用到的产生随机数的方法进行了封装,提供一个公共的方法去调用。

package cc.ccoder.mail.utils;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;
import java.util.Set;



/**
 * @作者: chencong
 * @项目: mail--cc.ccoder.mail.utils
 * @时间: 2017年6月8日上午11:12:10
 * @TODO:随机产生验证码
 */
public class RandonNumberUtils {


    /**
     * 随机生成字符 或 者数字
     * @return
     */
    private static String getRandom(){
        String value = "";
        Random random = new Random();
        int gen = random.nextInt(2);
        String charOrNum = gen % 2 ==0 ? "char":"num";
        if ("char".equals(charOrNum)) {
            //字符
            int temp = random.nextInt(2)%2==0?65:97;
            int ascii = random.nextInt(26);
            value += (char)(ascii + temp);
        }else if ("num".equals(charOrNum)) {
            //是数字
            value += String.valueOf(random.nextInt(10));
        }
        return value;
    }

    /**
     * 随机生成字符串(包含字符和数字)
     * @param length 指定长度
     * @return 返回set
     */
    private static Set getStrAndNum(int length) {
        Set set = new HashSet<>();
        for (int i = 0; i < length; i++) {
            String value = getRandom();
            set.add(value);
        }
        //若生成的字符串没达到指定长度 继续生成
        if (set.size() < length) {
            String value = getRandom();
            set.add(value);
        }
        return set;
    }

    /**
     * 存放在set中的字符组拼接成字符串
     * @param set
     * @return
     */
    private static  String printSet(Set set){ //打印set的方法
        Iterator iterator = set.iterator();
        String value = "";
        while (iterator.hasNext()) {
           //String ele = (String) iterator.next();
           value += (String)iterator.next();
        }
        return value;
       }

    /**
     * 返回生成的随机字符串
     * @param length 指定随机字符串长度
     * @return 指定长度 大于零 返回指定长度随机字符,小于等于零 返回null
     */
    public static String getRandonString(int length){
        String value= "";
        if (length > 0) {
            //如果返回的字符串小于指定长度 重新生成
            if (value.length() < length) {
                Set store = getStrAndNum(length);
                value = printSet(store);
            }
            return value;
        }else{
            return value;
        }
    }


    public static void main(String[] args) {
        System.out.println("4位随机验证码:  " + getRandonString(4));
        System.out.println("5位随机验证码:  " + getRandonString(5));
        System.out.println("6位随机验证码:  " + getRandonString(6));
    }
}

大概的思路就是首先在 getRandom()中产生随机数去模2,来判断是当前是位置用字符还是数字去填充。如果是字符就利用ASCII码在65–97当中,如果是数字就利用0 – 9中的。
对于产生指定长度的字符,都存放在getStrAndNum(int length)这个方法当中,如果产生的字符串长度小于指定长度,就再次调用产生字符的方法。


    /**
     * 随机生成字符串(包含字符和数字)
     * @param length 指定长度
     * @return 返回set
     */
    private static Set getStrAndNum(int length) {
        Set set = new HashSet<>();
        for (int i = 0; i < length; i++) {
            String value = getRandom();
            set.add(value);
        }
        //若生成的字符串没达到指定长度 继续生成
        if (set.size() < length) {
            String value = getRandom();
            set.add(value);
        }
        return set;
    }

然后还有一个需要注意的地方是 getRandonString(int length)给外部调用的这里面,对指定长度length做了判断。


    /**
     * 返回生成的随机字符串
     * @param length 指定随机字符串长度
     * @return 指定长度 大于零 返回指定长度随机字符,小于等于零 返回null
     */
    public static String getRandonString(int length){
        String value= "";
        if (length > 0) {
            //如果返回的字符串小于指定长度 重新生成
            if (value.length() < length) {
                Set store = getStrAndNum(length);
                value = printSet(store);
            }
            return value;
        }else{
            return value;
        }
    }

在这里首先对传入的length参数做判断,输入的长度是否大于零,是,则返回指定长度length的随机字符串,否则返回定义的value的值,在这里value初始化为空字符串。

上面贴的代码中有我用main方法测试的代码,下面就来输出一下测试的结果过。

public static void main(String[] args) {
        System.out.println("4位随机验证码:  " + getRandonString(4));
        System.out.println("5位随机验证码:  " + getRandonString(5));
        System.out.println("6位随机验证码:  " + getRandonString(6));
    }

结果

4位随机验证码:  4UZJ
5位随机验证码:  2C6vx
6位随机验证码:  3du8M

对了 ,调用的时候类名+方法名就行了,毕竟是静态方法对吧。
好了今天就先记录到这里,后面还有关于MD5明文加密等等一系列的工具类。

你可能感兴趣的:(技术指导,JavaEE)