我目前正在开发一个使用以下约定通过webview对用户进行身份验证的项目: https://username:password@domain.com
当用户拥有包含特殊字符的密码时,就会出现问题。我一直在寻找可能的解决方案。
我在收到身份验证请求时尝试使用handler.proceed但是无法使用该方法取得任何成功。
web视图loadURL方法只接受一个字符串,这个字符串是否自动进行URL编码?
我目前使用String.format(https://%s:%s@domain.com,用户名,密码)来格式化String
我的问题是可以在密码中使用带有特殊字符的当前约定。
这似乎只是运行任何低于4.4的操作系统的设备的问题
编辑:澄清。
答案 0 :(得分:0)
web视图loadURL方法只接受一个字符串,这个字符串是否自动进行URL编码?
没有。这将导致不希望的结果。以您自己的网址为例:
如果在加载之前将其进行url编码,则会变成类似:
https%3A%2F%2Fusername%3Apassword%40domain.com
显然,这没有多大意义。
我目前使用
String.format(https://%s:%s@domain.com)
来格式化String。 (...)是否可以使用密码中包含特殊字符的当前约定。
当然,请确保您对实际的用户名和密码进行了网址编码。例如,假设用户名是电子邮件地址:someone@somewhere.com
,密码包含一些“特殊”字符:@bc:d
。您当前的字符串格式化程序会将您的网址转换为:
https://someone@somewhere.com:@bc:d@domain.com
现在,显而易见的是,这看起来并不合适。相反,对用户名和密码进行url编码会将其转换为
https://someone%40somewhere.com:%40bc%3Ad@domain.com
这是一个完全合法的网址。编码的用户名和密码可以/然后在接收端再次解码。
要在Android上执行网址编码,请查看URLEncoded
和Uri.encode()
。