[JAVA] Uri Components Builder n'encode pas "+" selon la version de spring

phénomène

Supposons que vous souhaitiez encoder les paramètres de requête avec un code comme celui-ci.

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);

Le résultat du code ci-dessus dépend de la version de spring-web, comme indiqué dans le tableau ci-dessous.

spring-version web résultat
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

"+" N'est plus encodé dans la nouvelle version 5.0.

Cause

Comme mentionné autour de https://stackoverflow.com/questions/50432395/whats-the-proper-way-to-escape-url-variables-with-springs-resttemplate-when-ca, implémentation de l'encodage des paramètres de requête A changé pour la base RFC 3986, donc en quelque sorte.

Vérifiez la mise en œuvre. Une classe appelée HierarchicalUriComponents est en fait en charge de l'encodage, et il y a une partie à l'intérieur qui détermine s'il s'agit ou non d'une cible d'encodage.

C'est le cas en 4.3.

		QUERY_PARAM {
			@Override
			public boolean isAllowed(int c) {
				if ('=' == c || '+' == c || '&' == c) {
					return false;
				}
				else {
					return isPchar(c) || '/' == c || '?' == c;
				}
			}
		},

Dans la version 5.0, c'est le cas et vous pouvez voir que le "+" est désactivé.

		QUERY_PARAM {
			@Override
			public boolean isAllowed(int c) {
				if ('=' == c || '&' == c) {
					return false;
				}
				else {
					return isPchar(c) || '/' == c || '?' == c;
				}
			}
		},

Recommended Posts

Uri Components Builder n'encode pas "+" selon la version de spring
Spring Boot 2.0.0 ne démarre pas le Tomcat intégré
Lorsque @Transactional of Spring Boot ne fonctionne pas
Confirmation finale lorsque la version ruby ne change pas
Remarque: l'analyseur de mémoire ne fonctionne pas sous Mac OS
Le problème que la fenêtre contextuelle d'autorisation de notification push n'apparaît pas sur iOS14