1.情况是这样的,就是前段传的xml参数里存在’&'这种特殊字符,所以前端需要转义后再传给后端,也就是&转义为&后传给后端。
但是后端接收但这个参数时,会拼接url,就像下面这样的
http://www.xx.com/path/api?gender=M&name=L&G&color=red…
这个URL最后会通过下面这两行代码返回
URI uri = RestUtils.buildURI(xx,xx,xx);
return uri,roURL();
关键就是在buildURI方法中,会对整个url的参数进行转义,但是由于&符号在url里是用来分割参数的,所以这个L&G里的&并没有被正确转义。正常&转义后是%26,但是这里转义后&还是&,这就导致了在这个url进入下一步时不能正确识别参数,它会把L和G分割。
最后发现,如果在进入这两行代码前,将&替换成@@&@@,那它在经过buildURI时,@@&@@不会被转移,等到返回URL时,可以直接替换掉@@&@@为%26.
大概的代码如下
class EscapedUtils{
public static String encodeSymbol(String value){
return StringUtils.replace(value, "&","@@&@@");
}
public static String decodeSymbol(String value){
return StringUtils.replace(value, "@@&@@","%26");
}
}
然后上面返回的代码,就要把最后一行替换为
return new URL(EscapedUrtils.decode(uri.toURL().toString()));
记录一下,至于为什么@@&@@不会被转义,我还不知道,有知道的小伙伴告诉我一下,(* ̄︶ ̄)