java.net.PasswordAuthentication 接收一个用户名和一个密码字符数组。请传入密码的原始字符:

var credential = new java.net.PasswordAuthentication(
    "proxy-user", "p@ssword".toCharArray());

该值只是示例密码。在应用代码中,应从预期的凭据来源获取真实字符。

这个密码中的 @ 是数据,因为密码本身已经有自己的参数。在传给构造函数之前把它转换成 p%40ssword,实际传入的就是另一个密码。

代理 URL 有另一种凭据表示形式。在 http://proxy-user:p%[email protected]:8080 这样的 URL 中,编码后的 @ 属于用户信息内部,而后面的 @ 负责把该信息与主机分开。请根据实际使用该值的接口来决定解码和编码。

Shell 引号、Java 字符串字面量转义和 URL 百分号编码解决的也是不同的解析问题。先判断是哪一层在读取输入,而不是反复编码凭据直到请求行为发生变化。

相关文章