在平常的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位隨機驗證碼: 4UZJ
5位隨機驗證碼: 2C6vx
6位隨機驗證碼: 3du8M
對了 ,調用的時候類名+方法名就行了,畢竟是靜態方法對吧。
好了今天就先記錄到這裏,後面還有關於MD5明文加密等等一系列的工具類。