错误案例
图片验证在url包含特殊字符比如”abc%2B”的情况下始终无法通过
错误分析
开始以为是验证码服务器的问题,结果和平台那边联调的时候发现我们传过去的abc%2B 变成了abc%252B,这个当然有问题,我们起初认为了httpclient的版本问题,我们怀疑httpclient可能对输入的url再次转义,后来我在本地测试httpclient2和httpclient3的时候都没发现问题,最终还是发现了程序中的问题
转义之前: abc+
第一次转义:
String sessionID = StringEscapeUtil.escapeURL(random); -> abc%2B abc+ -> abc%2B
第二次转义:
checkCodeCheckURIBroker.addQueryData("sessionID", sessionID); checkCodeCheckURIBroker.addQueryData("code", checkcode.toUpperCase()); // 生成url url = checkCodeCheckURIBroker.render(); abc%2B -> abc%252B
原来是程序中作了两次转义导致的问题
正确用法
构造url的时候(特别是包含特殊字符)转义或者说编码是必须的,但只需一次。有时候我们应该多少了解某些函数是否将我们的传递的字符进行了转义或者编码,这样可以避免多次调用引起问题。
测试关注点
关于java转义,这是一个很明显的错误,开发人员在开发环境就可以测出来,无需测试人员参与