欢迎大家来到IT世界,在知识的湖畔探索吧!
今天接到一个初始密码生成的需求,要求生成的密码长度在8-16位,其中必须包含数字、大写字母、小写字母三种字符。平常都是使用hutool工具类进行字符处理,所以本次就基于hutool进行实现需求。
hutool官方文档参考地址:https://www.hutool.cn/docs/#/,hutool里面封装的方法很多,基本上能覆盖平常常用的方法,省去了自己封装工具类的过程,所以推荐使用!
发现hutool并没有提供完全满足要求的方法,自己就根据现有的方法进行封装实现这个需求.具体处理过程如下:
首先需要引入的hutool依赖:
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.2</version> </dependency>
欢迎大家来到IT世界,在知识的湖畔探索吧!
第一步实际需要做的处理就是在给定的字符串信息中选择生成8-16位随机字符,可以使用RandomUtil.randomString(String baseString, int length)进行实现;该方法实现的原理如下:
欢迎大家来到IT世界,在知识的湖畔探索吧!/** * 获得一个随机的字符串 * * @param baseString 随机字符选取的样本 * @param length 字符串的长度 * @return 随机字符串 */ public static String randomString(String baseString, int length) { if (StrUtil.isEmpty(baseString)) { return StrUtil.EMPTY; } final StringBuilder sb = new StringBuilder(length); if (length < 1) { length = 1; } int baseLength = baseString.length(); for (int i = 0; i < length; i++) { int number = randomInt(baseLength); sb.append(baseString.charAt(number)); } return sb.toString(); }
第二步是校验生成的随机数中是否包含数字、大小写的字符,可以使用StrUtil.containsAny(CharSequence str, CharSequence… testStrs)实现,实现原理如下:
/** * 查找指定字符串是否包含指定字符串列表中的任意一个字符串 * * @param str 指定字符串 * @param testStrs 需要检查的字符串数组 * @return 是否包含任意一个字符串 * @since 3.2.0 */ public static boolean containsAny(CharSequence str, CharSequence... testStrs) { return null != getContainsStr(str, testStrs); }
欢迎大家来到IT世界,在知识的湖畔探索吧!/** * 查找指定字符串是否包含指定字符串列表中的任意一个字符串,如果包含返回找到的第一个字符串 * * @param str 指定字符串 * @param testStrs 需要检查的字符串数组 * @return 被包含的第一个字符串 * @since 3.2.0 */ public static String getContainsStr(CharSequence str, CharSequence... testStrs) { if (isEmpty(str) || ArrayUtil.isEmpty(testStrs)) { return null; } for (CharSequence checkStr : testStrs) { if (str.toString().contains(checkStr)) { return checkStr.toString(); } } return null; }
对以上两个方法进行组装之后即可满足业务要求,注意生成的随机数必须包含三种字符,所以需要对生成的随机信息进行校验,如果不满足要求则继续生成。实现代码如下:
public class TestRandom{ private static final String upperStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final String lowerStr="abcdefghijklmnopqrstuvwxyz"; private static final String numStr=""; public static void main(String[] args) { String randomString=""; // 校验生成的随机数是否包含数字、大小写字母,如果不包含就重新生成。 while (!(StrUtil.containsAny(randomString,upperArray) && StrUtil.containsAny(randomString,lowerArray) && StrUtil.containsAny(randomString,numArray))){ // 生成8到17之间的随机整数(包含8不包含17) int randomInt = RandomUtil.randomInt(8, 17); randomString = RandomUtil.randomString(upperStr + lowerStr + numStr, randomInt); } System.out.println(randomString); } }
上面是全部实现过程,大家也可以使用原生的方法进行实现,hutool提供的工具类只不过是在原生方法基础上封装了一下.对于要求生成其他格式的字符串需求可以参考上述方案进行实现!
—— END ——
作者| 卖柴火的小男孩啊
多年后端开发经验,坚持分享更多java干货内容!
如果你喜欢我的文章,不妨点赞、转发、收藏一下哦!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/68209.html