Java中Access Token正则匹配替换失败,求正确掩码实现方案
问题:无法正确掩码Payload中的AccessToken值
需求:将字符串格式的响应Payload里的accessToken值替换为等长的星号掩码,示例如下:
输入Payload字符串:
{"accessToken":"knjnandHJHJBhjHJhjGhjghjGHJGhjgHJGjIG6gg8F68c6F6f6F6d67f79GV78INy8c5SV8n98f5D6g89Byf5446f678u8878GF756d57899bVY7TC6c7VY8UBi9u8","accessTokenExpirationTime":1800}
期望输出:
{"accessToken":"*********************************************************************************************************************","accessTokenExpirationTime":1800}
现有Java代码无法完成匹配替换,代码如下:
String payload = PAYLOAD_STRING; Pattern pattern = Pattern.compile("[a-zA-Z0-9]{126}$"); Matcher matcher = pattern.matcher(payload); String result = matcher.replaceAll("<h1>*</h1>"); System.out.println(result);
原代码问题分析
- 正则表达式错误:
[a-zA-Z0-9]{126}$中的$表示匹配字符串末尾,但accessToken值后还有",accessTokenExpirationTime..."内容,根本不在字符串末尾,导致匹配失败。 - 替换逻辑错误:用
<h1>*</h1>替换会把整个token换成单个星号加HTML标签,无法生成和原token等长的星号掩码。
解决方案
方案1:正则匹配+等长星号替换
修改正则表达式精准匹配accessToken的取值部分,再通过匹配结果生成等长星号:
String payload = "{\"accessToken\":\"knjnandHJHJBhjHJhjGhjghjGHJGhjgHJGjIG6gg8F68c6F6f6F6d67f79GV78INy8c5SV8n98f5D6g89Byf5446f678u8878GF756d57899bVY7TC6c7VY8UBi9u8\",\"accessTokenExpirationTime\":1800}"; // 匹配accessToken键对应的字符串值 Pattern pattern = Pattern.compile("\"accessToken\":\"([a-zA-Z0-9]+)\""); Matcher matcher = pattern.matcher(payload); StringBuffer resultBuffer = new StringBuffer(); while (matcher.find()) { // 生成与原token长度一致的星号字符串 String maskedToken = "*".repeat(matcher.group(1).length()); matcher.appendReplacement(resultBuffer, "\"accessToken\":\"" + maskedToken + "\""); } matcher.appendTail(resultBuffer); System.out.println(resultBuffer.toString());
方案2:JSON解析库(更可靠)
如果Payload是标准JSON格式,推荐用Jackson/Gson等专业库解析修改,避免正则的边界匹配问题:
以Jackson为例:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; public class TokenMasker { public static void main(String[] args) throws Exception { String payload = "{\"accessToken\":\"knjnandHJHJBhjHJhjGhjghjGHJGhjgHJGjIG6gg8F68c6F6f6F6d67f79GV78INy8c5SV8n98f5D6g89Byf5446f678u8878GF756d57899bVY7TC6c7VY8UBi9u8\",\"accessTokenExpirationTime\":1800}"; ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(payload); if (rootNode.has("accessToken") && rootNode.get("accessToken").isTextual()) { String originalToken = rootNode.get("accessToken").asText(); // 修改accessToken值为等长星号 ((ObjectNode) rootNode).put("accessToken", "*".repeat(originalToken.length())); } // 输出掩码后的JSON字符串 System.out.println(objectMapper.writeValueAsString(rootNode)); } }
内容的提问来源于stack exchange,提问作者nadinCodeHat
相关产品推荐
相关产品推荐

