Java 后端 生成登录令牌

53 阅读1分钟

方法工作原理

  1. 首先检查输入长度是否合法(必须≥1)

  2. 创建一个StringBuilder用于构建结果字符串

  3. 循环指定的次数(长度):

    • 从字符池中随机选择一个位置
    • 获取该位置的字符
    • 将字符添加到结果中
  4. 返回构建好的随机字符串

接下来看看业务代码是如何实现的吧~

令牌生成器

可以在工具类中创建 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());
}