Java Token 生成、保存和加载:TokenConfig 类详解
以下是代码示例的详细解析,解释了代码的功能和用到的知识点:
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();
}
}
}
}
代码功能解析
-
generateToken(String token, int userId)和generateToken(int userId)- 这两个方法负责生成 Token。
- 如果传入
token,则先删除旧的 Token,然后生成新的 Token。 - 两个方法都会将生成的 Token 与用户 ID 存储在
EfoApplication.tokens中,并保存到文件中。
-
saveToken()- 该方法将
EfoApplication.tokens中的数据转换为 JSON 格式,并保存到指定的文件路径(ConfigConsts.TOKEN_OF_SETTINGS)中。
- 该方法将
-
loadToken()- 该方法从文件中读取 JSON 数据,并将其解析为
Hashtable<String, Integer>对象,用于存储 Token 和用户 ID 的对应关系。
- 该方法从文件中读取 JSON 数据,并将其解析为
-
removeTokenByValue(int userId)- 该方法根据用户 ID 从
EfoApplication.tokens中删除对应的 Token,并将更新后的数据保存到文件中。
- 该方法根据用户 ID 从
知识点解析
-
HashtableHashtable是一个哈希表,用于存储键值对。它线程安全,适用于需要多线程访问的场景。在本例中,EfoApplication.tokens使用Hashtable来存储 Token 和用户 ID 的对应关系。
-
JSON 处理
- 使用
fastjson库来处理 JSON 数据。 JSON.parseArray()方法用于将 JSON 字符串解析成JSONArray对象。- 使用
forEach循环遍历JSONArray,将每个对象转换为JSONObject,并提取 Token 和用户 ID 信息。
- 使用
-
文件操作
- 使用
FileExecutor类来进行文件读写操作。 saveFile()方法用于将数据写入文件。readFile()方法用于从文件中读取数据。
- 使用
总结
该代码示例展示了如何使用 Java 创建一个 TokenConfig 类,用于生成、保存、加载和删除用户 Token。它使用了 Hashtable、JSON 处理、文件操作等技术,并提供了详细的注释说明,方便理解和使用。
在实际应用中,您可能需要根据具体情况调整代码,例如添加日志记录、异常处理等功能。
原文地址: https://www.cveoy.top/t/topic/nu1U 著作权归作者所有。请勿转载和采集!