Browse Source

Fix for encoding issue with MvcUriComponentsBuilder

Provide method for stronger encoding of expanded URI variables when
building links from views.

Issue: SPR-17027
pull/1916/head
Rossen Stoyanchev 8 years ago
parent
commit
5007d01c17
  1. 10
      spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java
  2. 36
      spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java

10
spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java

@ -832,6 +832,16 @@ public class MvcUriComponentsBuilder {
return this; return this;
} }
/**
* Use this method only if you need to apply strong encoding to expanded
* URI variables by quoting all characters with reserved meaning.
* @since 5.0.8
*/
public MethodArgumentBuilder encode() {
this.baseUrl.encode();
return this;
}
public String build() { public String build() {
return fromMethodInternal(this.baseUrl, this.controllerType, this.method, this.argumentValues) return fromMethodInternal(this.baseUrl, this.controllerType, this.method, this.argumentValues)
.build(false).encode().toUriString(); .build(false).encode().toUriString();

36
spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java

@ -363,12 +363,7 @@ public class MvcUriComponentsBuilderTests {
@Test @Test
public void fromMappingNamePlain() { public void fromMappingNamePlain() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); initWebApplicationContext(WebConfig.class);
context.setServletContext(new MockServletContext());
context.register(WebConfig.class);
context.refresh();
this.request.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
this.request.setServerName("example.org"); this.request.setServerName("example.org");
this.request.setServerPort(9999); this.request.setServerPort(9999);
this.request.setContextPath("/base"); this.request.setContextPath("/base");
@ -380,18 +375,35 @@ public class MvcUriComponentsBuilderTests {
@Test @Test
public void fromMappingNameWithCustomBaseUrl() { public void fromMappingNameWithCustomBaseUrl() {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); initWebApplicationContext(WebConfig.class);
context.setServletContext(new MockServletContext());
context.register(WebConfig.class);
context.refresh();
this.request.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
UriComponentsBuilder baseUrl = UriComponentsBuilder.fromUriString("http://example.org:9999/base"); UriComponentsBuilder baseUrl = UriComponentsBuilder.fromUriString("http://example.org:9999/base");
MvcUriComponentsBuilder mvcBuilder = relativeTo(baseUrl); MvcUriComponentsBuilder mvcBuilder = relativeTo(baseUrl);
String url = mvcBuilder.withMappingName("PAC#getAddressesForCountry").arg(0, "DE").buildAndExpand(123); String url = mvcBuilder.withMappingName("PAC#getAddressesForCountry").arg(0, "DE").buildAndExpand(123);
assertEquals("http://example.org:9999/base/people/123/addresses/DE", url); assertEquals("http://example.org:9999/base/people/123/addresses/DE", url);
} }
@Test // SPR-17027
public void fromMappingNameWithEncoding() {
initWebApplicationContext(WebConfig.class);
this.request.setServerName("example.org");
this.request.setServerPort(9999);
this.request.setContextPath("/base");
String mappingName = "PAC#getAddressesForCountry";
String url = fromMappingName(mappingName).arg(0, "DE;FR").encode().buildAndExpand("_+_");
assertEquals("/base/people/_%2B_/addresses/DE%3BFR", url);
}
private void initWebApplicationContext(Class<?> configClass) {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.setServletContext(new MockServletContext());
context.register(configClass);
context.refresh();
this.request.setAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
}
static class Person { static class Person {

Loading…
Cancel
Save