以下是代码示例的详细解析,解释了代码的功能和用到的知识点:

package com.zhazhapan.efo.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zhazhapan.efo.EfoApplication;
import com.zhazhapan.efo.modules.constant.ConfigConsts;
import com.zhazhapan.modules.constant.ValueConsts;
import com.zhazhapan.util.Checker;
import com.zhazhapan.util.FileExecutor;
import com.zhazhapan.util.Formatter;
import com.zhazhapan.util.RandomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Hashtable;
public class TokenConfig {

    private static Logger logger = LoggerFactory.getLogger(TokenConfig.class);

    /**
     * 生成 Token,如果传入的 token 不为空,则先从 tokens 中删除该 token,
     * 然后再重新生成一个 token,并将其与用户 ID 存入 tokens 中。
     * 返回生成的 token。
     *
     * @param token  传入的 token
     * @param userId 用户 ID
     * @return 生成的 token
     */
    public static String generateToken(String token, int userId) {
        if (Checker.isNotEmpty(token)) {
            EfoApplication.tokens.remove(token);
        }
        return generateToken(userId);
    }

    /**
     * 生成 Token,直接生成一个新的 token 并将其与用户 ID 存入 tokens 中。
     * 返回生成的 token。
     *
     * @param userId 用户 ID
     * @return 生成的 token
     */
    public static String generateToken(int userId) {
        String token = RandomUtils.getRandomStringOnlyLetter(ValueConsts.THIRTY_TWO_INT);
        EfoApplication.tokens.put(token, userId);
        saveToken();
        return token;
    }

    /**
     * 将 tokens 中的数据保存到文件中(文件路径为 ConfigConsts.TOKEN_OF_SETTINGS 对应的路径)。
     */
    public static void saveToken() {
        String tokens = Formatter.mapToJson(EfoApplication.tokens);
        try {
            FileExecutor.saveFile(SettingConfig.getStoragePath(ConfigConsts.TOKEN_OF_SETTINGS), tokens);
        } catch (Exception e) {
            logger.error("save token error: " + e.getMessage());
        }
    }

    /**
     * 加载之前保存到文件中的 tokens 数据,返回一个 Hashtable<String, Integer> 类型的 tokens 对象。
     *
     * @return tokens 对象
     */
    public static Hashtable<String, Integer> loadToken() {
        Hashtable<String, Integer> tokens = new Hashtable<>(ValueConsts.SIXTEEN_INT);
        try {
            String token = FileExecutor.readFile(SettingConfig.getStoragePath(ConfigConsts.TOKEN_OF_SETTINGS));
            JSONArray array = JSON.parseArray(token);
            array.forEach(object -> {
                JSONObject jsonObject = (JSONObject) object;
                tokens.put(jsonObject.getString(ValueConsts.KEY_STRING), jsonObject.getInteger(ValueConsts
                        .VALUE_STRING));
            });
        } catch (Exception e) {
            logger.error("load token error: " + e.getMessage());
        }
        return tokens;
    }

    /**
     * 根据用户 ID 移除 tokens 中的数据。
     *
     * @param userId 用户 ID
     */
    public static void removeTokenByValue(int userId) {
        if (userId > 0) {
            String removeKey = "";
            for (String key : EfoApplication.tokens.keySet()) {
                if (EfoApplication.tokens.get(key) == userId) {
                    removeKey = key;
                    break;
                }
            }
            if (Checker.isNotEmpty(removeKey)) {
                EfoApplication.tokens.remove(removeKey);
                TokenConfig.saveToken();
            }
        }
    }
}

代码功能解析

  1. generateToken(String token, int userId)generateToken(int userId)

    • 这两个方法负责生成 Token。
    • 如果传入 token,则先删除旧的 Token,然后生成新的 Token。
    • 两个方法都会将生成的 Token 与用户 ID 存储在 EfoApplication.tokens 中,并保存到文件中。
  2. saveToken()

    • 该方法将 EfoApplication.tokens 中的数据转换为 JSON 格式,并保存到指定的文件路径(ConfigConsts.TOKEN_OF_SETTINGS)中。
  3. loadToken()

    • 该方法从文件中读取 JSON 数据,并将其解析为 Hashtable<String, Integer> 对象,用于存储 Token 和用户 ID 的对应关系。
  4. removeTokenByValue(int userId)

    • 该方法根据用户 ID 从 EfoApplication.tokens 中删除对应的 Token,并将更新后的数据保存到文件中。

知识点解析

  1. Hashtable

    • Hashtable 是一个哈希表,用于存储键值对。它线程安全,适用于需要多线程访问的场景。在本例中,EfoApplication.tokens 使用 Hashtable 来存储 Token 和用户 ID 的对应关系。
  2. JSON 处理

    • 使用 fastjson 库来处理 JSON 数据。
    • JSON.parseArray() 方法用于将 JSON 字符串解析成 JSONArray 对象。
    • 使用 forEach 循环遍历 JSONArray,将每个对象转换为 JSONObject,并提取 Token 和用户 ID 信息。
  3. 文件操作

    • 使用 FileExecutor 类来进行文件读写操作。
    • saveFile() 方法用于将数据写入文件。
    • readFile() 方法用于从文件中读取数据。

总结

该代码示例展示了如何使用 Java 创建一个 TokenConfig 类,用于生成、保存、加载和删除用户 Token。它使用了 Hashtable、JSON 处理、文件操作等技术,并提供了详细的注释说明,方便理解和使用。

在实际应用中,您可能需要根据具体情况调整代码,例如添加日志记录、异常处理等功能。

Java Token 生成、保存和加载:TokenConfig 类详解

原文地址: https://www.cveoy.top/t/topic/nu1U 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录