Java工具類——隨機驗證碼RandNumberUtils
阿新 • • 發佈:2019-01-08
在平常的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明文加密等等一系列的工具類。