RFC 3986文档规定,Url中只允许包含英文字母(a-z,A-Z)、数字(0-9)、- _ . ~ 4个特殊字符以及所有保留字符。
RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]
当发送带有特殊字符的url请求(如:http://127.0.0.1:8080/list?users[0].age=26&users[0].name=mingming)时,如果不进行encode,就会报错 java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
。
Postman是常用的url测试工具,可以方便的对url进行encode(选中需要encode的地方,右击),在使用encode功能时我遇到一个容易犯错的点,encode参数而不是url:
如果encode了整个url,如下图错误示例所示,最终的url是http%3A%2F%2F127.0.0.1%3A8080%2Flist%3Fusers%5B0%5D.age%3D26%26users%5B0%5D.name%3Dmingming
,它把url中所有满足特殊字符都按照替换规则都encode了,导致很多满足正常需求的特殊字符也被替换了,如http://
中的://
。
正确的做法是在参数位置选择要加密的参数并加密。
正确示例.png
网友评论