如何用Java的StringBuilder可靠屏蔽URL中的密码参数
用StringBuilder实现URL中密码内容的屏蔽
需要在日志展示URL时,将URL里&password=之后的密码内容替换为######,密码值不固定,要求使用StringBuilder完成该功能。
示例:
输入:
https://hlg-gateway.odsus.com.br/token?grant_type=password&username=cards-app&password=cards-app;
预期输出:https://hlg-gateway.odsus.com.br/token?grant_type=password&username=cards-app&password=######;
代码实现
public static String maskPasswordInUrl(String originalUrl) { StringBuilder urlBuilder = new StringBuilder(originalUrl); String passwordPrefix = "&password="; int startIndex = urlBuilder.indexOf(passwordPrefix); if (startIndex == -1) { return urlBuilder.toString(); } int passwordStart = startIndex + passwordPrefix.length(); int passwordEnd = urlBuilder.indexOf("&", passwordStart); // 处理密码在URL末尾的情况,兼容分号结尾场景 if (passwordEnd == -1) { passwordEnd = urlBuilder.length(); if (passwordEnd > 0 && urlBuilder.charAt(passwordEnd - 1) == ';') { passwordEnd--; } } urlBuilder.replace(passwordStart, passwordEnd, "######"); return urlBuilder.toString(); } // 测试用例 public static void main(String[] args) { String input = "https://hlg-gateway.odsus.com.br/token?grant_type=password&username=cards-app&password=cards-app;"; System.out.println(maskPasswordInUrl(input)); }
逻辑说明
- 用
StringBuilder包裹原URL,利用其高效的字符替换能力避免字符串拼接带来的性能损耗 - 定位
&password=的起始位置,未找到该参数则直接返回原URL - 确定密码内容的起止范围:从
&password=结束后开始,到下一个&(后续参数分隔符)或者URL末尾(兼容示例中的分号结尾场景) - 通过
replace方法精准替换密码内容为######
内容的提问来源于stack exchange,提问作者Luiz Ricardo Cardoso
相关产品推荐
相关产品推荐

