Angenommen, Sie möchten Abfrageparameter mit dem folgenden Code codieren.
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("key", "a+b");
String u = UriComponentsBuilder.fromHttpUrl("http://www.google.com").queryParams(params).build().encode().toString();
System.out.println(u);
Das Ergebnis des obigen Codes hängt von der Version von Spring-Web ab, wie in der folgenden Tabelle gezeigt.
spring-Webversion | Ergebnis |
---|---|
spring-boot1(spring-web-4.3.18.RELEASE) | http://www.google.com?key=a%2Bb |
spring-boot2(spring-web-5.0.4.RELEASE) | http://www.google.com?key=a+b |
In der neuen Version 5.0 wird "+" nicht mehr codiert.
Wie unter https://stackoverflow.com/questions/50432395/whats-the-proper-way-to-escape-url-variables-with-springs-resttemplate-when-ca beschrieben, Implementierung der Codierung von Abfrageparametern Hat sich also irgendwie auf RFC 3986 Basis geändert.
Überprüfen Sie die Implementierung. Eine Klasse namens HierarchicalUriComponents ist tatsächlich für die Codierung zuständig, und es gibt einen Teil darin, der bestimmt, ob es sich um ein Codierungsziel handelt oder nicht.
Dies ist in 4.3 der Fall.
QUERY_PARAM {
@Override
public boolean isAllowed(int c) {
if ('=' == c || '+' == c || '&' == c) {
return false;
}
else {
return isPchar(c) || '/' == c || '?' == c;
}
}
},
In 5.0 ist dies der Fall und Sie können sehen, dass das "+" ausgeschaltet ist.
QUERY_PARAM {
@Override
public boolean isAllowed(int c) {
if ('=' == c || '&' == c) {
return false;
}
else {
return isPchar(c) || '/' == c || '?' == c;
}
}
},
Recommended Posts