验证码的生成----java实现

1. 随机产生验证码:

 给定一个长度,随机产生一个该长度的字符串,由大写,小写字母以及数字组成

方法一:查表法实现随机产生验证码

public static String CodeTest(Random random){
		String str="";
		char[] letNum=new char[]{'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q',
				'R','S','T','U','V','W','X','Y','Z','a','b','c','e','f','g','h','i','j','k','l','m','n',
				'o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9'};
		int index;
		boolean[] flag=new boolean[letNum.length]; //默认是false
		for(int i=0;i<4;i++){
			do{
				index=random.nextInt(letNum.length);
			}while(flag[index]==true);
			char ch=letNum[index];
			str+=ch;
			flag[index]=true;
		}
		return str;
	}

方法二:switch语句实现随机产生验证码(推荐使用)

public static String RandomCode(Random rand){
		String str="";
		for(int i=0;i<4;i++){
			int num=rand.nextInt(3);
			switch(num){
				case 0:
					char upper=(char)(rand.nextInt(26)+'A');
					str+=upper;
					break;
				case 1:
					char low=(char)(rand.nextInt(26)+'a');
					str+=low;
					break;
				case 2:
					str+=rand.nextInt(10);
			}
		}
		return str;
	}

方法三:直接使用字符串实现随机产生验证码,用到了StringBuffer构造器,代码优化了,比方法一好用

public static String RandomStr(Random rand,int length){
		String str="1234567890ABCDEFGHIJKMLNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		StringBuffer sb=new StringBuffer();
		for(int i=0;i<length;i++){
			int num=rand.nextInt(62);
			sb.append(str.charAt(num)); 
		}
		String newStr=sb.toString();
		return newStr;
	}

主方法:

public static void main(String[] args) {
		// TODO Auto-generated method stub

		Random random=new Random();
		String str=CodeTest(random);
		System.out.println();
		System.out.println(str);
		String str2=RandomCode(random);
		System.out.println(str2);
		String str3=RandomStr(random,4);
		System.out.println(str3);
	}

2. 条码的验证

问题描述:验证ean-13条码的验证码是否正确 
       String code = "6921168509256";
       取前12位的奇数位的和
       取前12位的偶数位的和
       将"奇数位和"与"偶数位和的三倍"相加求和
       取和的个位数,然后用10减去这个个位数,相减的结果就是条码的验证码
       如果条码的第13位数字和这个验证码相同就说明验证码正确
       分析:我们拿到的是字符串,不好做判断,所以首先需要把字符串转为可计算的整型数组,字符串不能直接转整形数组,这里借助字符数组进行转换;然后按要求分别取到寄数位与偶数位的元素并求和;得到条码的验证码并与条码的最后一位作比较。

代码实现:

public class CodeTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String code="6921168509256";
		char[] chrr=code.toCharArray();
		Code(chrr);
		if(Code(chrr)){
			System.out.println("验证码正确!");
		}
		else{
			System.out.println("验证码错误!");
		}
	}

	public static boolean Code(char[] ch){
	
		int[]a=new int[ch.length]; 
		int[] arr=new int[12];  //保存偶数位元素
		int[] brr=new int[12];  //保存奇数位元素
		int j=0,aindex=0,bindex=0;
		int asum=0,bsum=0;
		for(char temp:ch){   //字符数组转整型数组
			a[j++]=Integer.parseInt(String.valueOf(temp));
		}
		for(int i=0;i<a.length-1;i++){
			if((i+1)%2==0){ //判断偶数位
				arr[aindex++]=a[i];
			}
			else{   
				brr[bindex++]=a[i];
			}
		}
		for(int i=0;i<arr.length;i++){
			asum+=arr[i]; //偶数位和
		}
		for(int i=0;i<brr.length;i++){
			bsum+=brr[i];  //奇数位和
		}
		int sum=asum*3+bsum;
		int num=10-(sum%10);  //得到条码的验证码
		if(num==a[a.length-1])
			return true;
		else
			return false;
	}
}

优化代码:注解使用字符串实现

public class CodeTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String code="6921168509256";
		if(Code(code)){
			System.out.println("验证码正确!");
		}
		else{
			System.out.println("验证码错误!");
		}
	}

	public static boolean Code(String str){
                int s1=0,s2=0,sum=0;
                for(int i=0;i<str.langth();i++){
                        if((i+1)%2==0)
                            s1=s1+(str.charAt(i)-48);   // 偶数位元素之和
                        else
                            s2=s2+(str.charAt(i)-48);  // 奇数位元素之和
                }
                sum=s1*3+s1;
                int code=10-sum&10;
                int num=str.charAt(12)-48;   //取条码的最后一位数  
                if(code==num)
			return true;
		else
			return false;
        }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文件里面的是错的,用这个。 function validate(str){ str = str.value; var numberCount = 0; var upperCaseCount = 0; var lowerCaseCount = 0; var otherCharCount = 0; var numberIndex = 0; var upperCaseIndex = 0; var lowerCaseIndex = 0; var otherCharIndex = 0; for (var i = 0; i < str.length; i++) { var temp = str.charAt(i).charCodeAt(); if (temp >= 48 && temp <= 57) { numberIndex = i; numberCount++; }else if(temp >= 65 && temp <= 90){ upperCaseIndex = i; upperCaseCount++; }else if(temp >= 97 && temp <= 122){ lowerCaseIndex = i; lowerCaseCount++; }else{ otherCharIndex = i; otherCharCount++; } } if (numberCount == 0 || (numberCount == 1 && (numberIndex == 0 || numberIndex == str.length-1 ))) { return false; } if (upperCaseCount == 0 || (upperCaseCount == 1 && (upperCaseIndex == 0 || upperCaseIndex == str.length-1 ))) { return false; } if (lowerCaseCount == 0 || (lowerCaseCount == 1 && (lowerCaseIndex == 0 || lowerCaseIndex == str.length-1 ))) { return false; } if (otherCharCount == 0 || (otherCharCount == 1 && (otherCharIndex == 0 || otherCharIndex == str.length-1 ))) { return false; } var reg=/^\w{8,31}$/; var sup=/[A-Z]{1}?/g; var low=/[a-z]{1}?/g; var num=/[0-9][1]?/g; var arr; if(str.match(reg)){ arr=str.match(sup); if(arr && arr.length==1) { return (!str.substr(0,1).match(sup) && !str.substr(str.length-1,str.length).match(sup)) } arr=str.match(low); if(arr && arr.length==1) { return (!str.substr(0,1).match(low) && !str.substr(str.length-1,str.length).match(low)) } arr=str.match(num); if(arr && arr.length==1) { return (!str.substr(0,1).match(num) && !str.substr(str.length-1,str.length).match(num)) } for(var i=0;i<str.length/2;i++){ if(str.split(str.substr(0,i+1)).join('')==''){ return false; } } return true; } return false; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值