生成隨機密碼,密碼至少要包含 大寫字母,小寫字母,數字,特殊字符四者中的三種組合,並且要滿足線程安全。代碼如下:
public class PasswordGenerator {
private static final String PASSWORD_REGEX = "((^(?=.*[a-z])(?=.*[A-Z])(?=.*\\W)[\\da-zA-Z\\W]{8,16}$)|(^(?=.*\\d)(?=.*[A-Z])(?=.*\\W)[\\da-zA-Z\\W]{8,16}$)|(^(?=.*\\d)(?=.*[a-z])(?=.*\\W)[\\da-zA-Z\\W]{8,16}$)|(^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[\\da-zA-Z\\W]{8,16}$))";
private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX);
private static final char[] SEEDS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890~!@#$%^&*.?-+=_"
.toCharArray();
/**
* 生成指定長度的隨機密碼
*
* @param length 密碼長度
*/
public static String generatePassword(int length) {
String result = getRandomPassword(length);
Matcher m = PASSWORD_PATTERN.matcher(result);
if (m.matches()) {
return result;
}
return generatePassword(length);
}
private static String getRandomPassword(int length) {
StringBuilder sb = new StringBuilder();
ThreadLocalRandom r = ThreadLocalRandom.current();
for (int x = 0; x < length; ++x) {
sb.append(SEEDS[r.nextInt(SEEDS.length)]);
}
return sb.toString();
}
}