[JAVA] Uri Components Builder codiert je nach Version der Feder nicht "+"

Phänomen

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.

Ursache

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

Uri Components Builder codiert je nach Version der Feder nicht "+"
Spring Boot 2.0.0 startet den integrierten Tomcat nicht
Wenn @Transactional of Spring Boot nicht funktioniert
Endgültige Bestätigung, wenn die Ruby-Version nicht wechselt
Hinweis: Memory Analyzer funktioniert unter Mac OS nicht
Das Problem, dass das Popup-Fenster für Push-Benachrichtigungsberechtigungen unter iOS14 nicht angezeigt wird