方法工作原理
-
首先检查输入长度是否合法(必须≥1)
-
创建一个StringBuilder用于构建结果字符串
-
循环指定的次数(长度):
- 从字符池中随机选择一个位置
- 获取该位置的字符
- 将字符添加到结果中
-
返回构建好的随机字符串
接下来看看业务代码是如何实现的吧~
令牌生成器
可以在工具类中创建 TokenGeneratorUtils.java,代码内容如下:
package org.test.cloud.ee.service.platform.utils;
import java.security.SecureRandom;
/**
* 令牌生成器
*/
public class TokenGeneratorUtils {
private static final String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz";
private static final String CHAR_UPPER = CHAR_LOWER.toUpperCase();
private static final String NUMBER = "0123456789";
private static final String DATA_FOR_RANDOM_STRING = CHAR_LOWER + CHAR_UPPER + NUMBER; //字符池
private static final SecureRandom random = new SecureRandom(); // 使用加密强度高的随机数生成器,比普通的Random类更安全
public static String generateRandomString(int length) {
if (length < 1) throw new IllegalArgumentException();
StringBuilder sb = new StringBuilder(length); // 生成指定长度的随机字符串
for (int i = 0; i < length; i++) {
int rndCharAt = random.nextInt(DATA_FOR_RANDOM_STRING.length()); // 返回 [0,62)的随机数
char rndChar = DATA_FOR_RANDOM_STRING.charAt(rndCharAt);
sb.append(rndChar);
}
return sb.toString();
}
}
业务代码
在实际的业务代码中去调用令牌生成器,生成出唯一的令牌并保存,可以参考以下代码。
import org.test.cloud.ee.service.platform.utils.TokenGeneratorUtils;
private void saveUserToken(SysUser sysUser) {
log.info("生成登录令牌,用户id:{}", sysUser.getId());
// 随机生成字母+数字的6位数字符串,作为唯一标识
String token; // 登录令牌
boolean isUnique; // 唯一标识
// 循环生成,直到唯一为止
do {
token = TokenGeneratorUtils.generateRandomString(6); // 随机生成 6 位字符串的登录令牌
// 校验该令牌是否唯一(根据实际情况调整)
LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysUser::getUserToken, token);
isUnique = sysUserMapper.selectCount(queryWrapper) == 0;
} while (!isUnique);
sysUser.setUserToken(token); // set 登录令牌,为后续处理做准备
log.info("生成登录令牌成功,用户id:{}", sysUser.getId());
}