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

来源:互联网 发布:日常喝的红酒推荐 知乎 编辑:程序博客网 时间:2024/05/17 22:22

在平常的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<String> getStrAndNum(int length) {        Set<String> 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<String> 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<String> getStrAndNum(int length) {        Set<String> 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<String> 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位随机验证码:  4UZJ5位随机验证码:  2C6vx6位随机验证码:  3du8M

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

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 机械手不能回归原点该怎么办 前缘送纸纸板翘怎么办 三菱AL 1R.2报警怎么办 工作好但领导不好伺候怎么办 孕妇憋尿憋的小腹疼怎么办 怀孕憋尿憋的小腹疼怎么办 半夜憋尿憋的小腹疼怎么办 新生儿大便次数较多怎么办 母猎生下三天没有奶怎么办 孩孑大便干不爱喝水怎么办 发那科1050报警怎么办 plc模块bf亮了怎么办 plc模块df亮了怎么办 西门子触摸屏进不了主画面怎么办 pos机显示白屏怎么办 洗衣机的门坏了怎么办 西门子洗衣机门坏了怎么办 拆线线断在肉里怎么办 总线绝对值编码器方向反了怎么办 台达伺服报警009怎么办 台达plc禁止上传怎么办? 潜水泵电机启动绕组断线了怎么办? 永磁电机磁没了怎么办 热水器热水管坏了怎么办 松下伺服驱动器坏了怎么办 步进电机功率小了怎么办 电三轮电机坏了怎么办 电动车钢圈撞变形了怎么办 电动车后轮钢圈变形了怎么办 软油管接头渗油怎么办 一只单眼皮一只双眼皮怎么办 儿童轻轻泥干了怎么办 5d轻轻泥干了怎么办 手机炉石一直闪退怎么办 鸟之羽任务失败怎么办 巫师3没血没药怎么办 荣威rx5灯光不亮怎么办 点滴打没了回血怎么办 加了低标号的油怎么办 别克车钥匙丢了怎么办 霜子哀伤断了怎么办