parent
							
								
									895fa2ea7b
								
							
						
					
					
						commit
						4d52590964
					
				|  | @ -275,7 +275,7 @@ public class UriComponentsBuilder implements UriBuilder, Cloneable { | |||
| 	/** | ||||
| 	 * Create a new {@code UriComponents} object from the URI associated with | ||||
| 	 * the given HttpRequest while also overlaying with values from the headers | ||||
| 	 * "Forwarded" (<a href="http://tools.ietf.org/html/rfc7239">RFC 7239</a>, | ||||
| 	 * "Forwarded" (<a href="http://tools.ietf.org/html/rfc7239">RFC 7239</a>), | ||||
| 	 * or "X-Forwarded-Host", "X-Forwarded-Port", and "X-Forwarded-Proto" if | ||||
| 	 * "Forwarded" is not found. | ||||
| 	 * @param request the source request | ||||
|  |  | |||
|  | @ -70,18 +70,28 @@ import org.springframework.web.util.UriComponentsBuilder; | |||
| 
 | ||||
| /** | ||||
|  * Creates instances of {@link org.springframework.web.util.UriComponentsBuilder} | ||||
|  * by pointing to Spring MVC controllers and {@code @RequestMapping} methods. | ||||
|  * by pointing to {@code @RequestMapping} methods on Spring MVC controllers. | ||||
|  * | ||||
|  * <p>The static {@code fromXxx(...)} methods prepare links relative to the | ||||
|  * current request as determined by a call to | ||||
|  * <p>There are several groups of methods: | ||||
|  * <ul> | ||||
|  * <li>Static {@code fromXxx(...)} methods to prepare links using information | ||||
|  * from the current request as determined by a call to | ||||
|  * {@link org.springframework.web.servlet.support.ServletUriComponentsBuilder#fromCurrentServletMapping()}. | ||||
|  * <li>Static {@code fromXxx(UriComponentsBuilder,...)} methods can be given | ||||
|  * a baseUrl when operating outside the context of a request. | ||||
|  * <li>Instance-based {@code withXxx(...)} methods where an instance of | ||||
|  * MvcUriComponentsBuilder is created with a baseUrl via | ||||
|  * {@link #relativeTo(org.springframework.web.util.UriComponentsBuilder)}. | ||||
|  * </ul> | ||||
|  * | ||||
|  * <p>The static {@code fromXxx(UriComponentsBuilder,...)} methods can be given | ||||
|  * the baseUrl when operating outside the context of a request. | ||||
|  * | ||||
|  * <p>You can also create an MvcUriComponentsBuilder instance with a baseUrl | ||||
|  * via {@link #relativeTo(org.springframework.web.util.UriComponentsBuilder)} | ||||
|  * and then use the non-static {@code withXxx(...)} method variants. | ||||
|  * <p><strong>Note:</strong> This class extracts and uses values from the headers | ||||
|  * "Forwarded" (<a href="http://tools.ietf.org/html/rfc7239">RFC 7239</a>), | ||||
|  * or "X-Forwarded-Host", "X-Forwarded-Port", and "X-Forwarded-Proto" if | ||||
|  * "Forwarded" is not found, in order to reflect the client-originated protocol | ||||
|  * and address. As an alternative consider using the | ||||
|  * {@link org.springframework.web.filter.ForwardedHeaderFilter} to have such | ||||
|  * headers extracted once and removed, or removed only (without being used). | ||||
|  * See the reference for further information including security considerations. | ||||
|  * | ||||
|  * @author Oliver Gierke | ||||
|  * @author Rossen Stoyanchev | ||||
|  | @ -142,6 +152,8 @@ public class MvcUriComponentsBuilder { | |||
| 	 * Create a {@link UriComponentsBuilder} from the mapping of a controller class | ||||
| 	 * and current request information including Servlet mapping. If the controller | ||||
| 	 * contains multiple mappings, only the first one is used. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @param controllerType the controller to build a URI for | ||||
| 	 * @return a UriComponentsBuilder instance (never {@code null}) | ||||
| 	 */ | ||||
|  | @ -154,6 +166,8 @@ public class MvcUriComponentsBuilder { | |||
| 	 * {@code UriComponentsBuilder} representing the base URL. This is useful | ||||
| 	 * when using MvcUriComponentsBuilder outside the context of processing a | ||||
| 	 * request or to apply a custom baseUrl not matching the current request. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @param builder the builder for the base URL; the builder will be cloned | ||||
| 	 * and therefore not modified and may be re-used for further calls. | ||||
| 	 * @param controllerType the controller to build a URI for | ||||
|  | @ -171,6 +185,8 @@ public class MvcUriComponentsBuilder { | |||
| 	 * Create a {@link UriComponentsBuilder} from the mapping of a controller | ||||
| 	 * method and an array of method argument values. This method delegates | ||||
| 	 * to {@link #fromMethod(Class, Method, Object...)}. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @param controllerType the controller | ||||
| 	 * @param methodName the method name | ||||
| 	 * @param args the argument values | ||||
|  | @ -190,6 +206,8 @@ public class MvcUriComponentsBuilder { | |||
| 	 * accepts a {@code UriComponentsBuilder} representing the base URL. This is | ||||
| 	 * useful when using MvcUriComponentsBuilder outside the context of processing | ||||
| 	 * a request or to apply a custom baseUrl not matching the current request. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @param builder the builder for the base URL; the builder will be cloned | ||||
| 	 * and therefore not modified and may be re-used for further calls. | ||||
| 	 * @param controllerType the controller | ||||
|  | @ -237,6 +255,10 @@ public class MvcUriComponentsBuilder { | |||
| 	 * controller.getAddressesForCountry("US") | ||||
| 	 * builder = MvcUriComponentsBuilder.fromMethodCall(controller); | ||||
| 	 * </pre> | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * | ||||
| 	 * @param info either the value returned from a "mock" controller | ||||
| 	 * invocation or the "mock" controller itself after an invocation | ||||
| 	 * @return a UriComponents instance | ||||
|  | @ -255,6 +277,8 @@ public class MvcUriComponentsBuilder { | |||
| 	 * {@code UriComponentsBuilder} representing the base URL. This is useful | ||||
| 	 * when using MvcUriComponentsBuilder outside the context of processing a | ||||
| 	 * request or to apply a custom baseUrl not matching the current request. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @param builder the builder for the base URL; the builder will be cloned | ||||
| 	 * and therefore not modified and may be re-used for further calls. | ||||
| 	 * @param info either the value returned from a "mock" controller | ||||
|  | @ -305,6 +329,10 @@ public class MvcUriComponentsBuilder { | |||
| 	 * </pre> | ||||
| 	 * <p>Note that it's not necessary to specify all arguments. Only the ones | ||||
| 	 * required to prepare the URL, mainly {@code @RequestParam} and {@code @PathVariable}). | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * | ||||
| 	 * @param mappingName the mapping name | ||||
| 	 * @return a builder to prepare the URI String | ||||
| 	 * @throws IllegalArgumentException if the mapping name is not found or | ||||
|  | @ -320,6 +348,8 @@ public class MvcUriComponentsBuilder { | |||
| 	 * {@code UriComponentsBuilder} representing the base URL. This is useful | ||||
| 	 * when using MvcUriComponentsBuilder outside the context of processing a | ||||
| 	 * request or to apply a custom baseUrl not matching the current request. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @param builder the builder for the base URL; the builder will be cloned | ||||
| 	 * and therefore not modified and may be re-used for further calls. | ||||
| 	 * @param name the mapping name | ||||
|  | @ -352,6 +382,8 @@ public class MvcUriComponentsBuilder { | |||
| 	 * {@link org.springframework.web.method.support.UriComponentsContributor | ||||
| 	 * UriComponentsContributor}) while remaining argument values are ignored and | ||||
| 	 * can be {@code null}. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @param controllerType the controller type | ||||
| 	 * @param method the controller method | ||||
| 	 * @param args argument values for the controller method | ||||
|  | @ -368,6 +400,8 @@ public class MvcUriComponentsBuilder { | |||
| 	 * This is useful when using MvcUriComponentsBuilder outside the context of | ||||
| 	 * processing a request or to apply a custom baseUrl not matching the | ||||
| 	 * current request. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @param baseUrl the builder for the base URL; the builder will be cloned | ||||
| 	 * and therefore not modified and may be re-used for further calls. | ||||
| 	 * @param controllerType the controller type | ||||
|  | @ -549,6 +583,9 @@ public class MvcUriComponentsBuilder { | |||
| 	 * <pre class="code"> | ||||
| 	 * MvcUriComponentsBuilder.fromMethodCall(on(FooController.class).getFoo(1)).build(); | ||||
| 	 * </pre> | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * | ||||
| 	 * @param controllerType the target controller | ||||
| 	 */ | ||||
| 	public static <T> T on(Class<T> controllerType) { | ||||
|  | @ -571,6 +608,8 @@ public class MvcUriComponentsBuilder { | |||
| 	 * fooController.saveFoo(2, null); | ||||
| 	 * builder = MvcUriComponentsBuilder.fromMethodCall(fooController); | ||||
| 	 * </pre> | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @param controllerType the target controller | ||||
| 	 */ | ||||
| 	public static <T> T controller(Class<T> controllerType) { | ||||
|  | @ -626,6 +665,8 @@ public class MvcUriComponentsBuilder { | |||
| 	/** | ||||
| 	 * An alternative to {@link #fromController(Class)} for use with an instance | ||||
| 	 * of this class created via a call to {@link #relativeTo}. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @since 4.2 | ||||
| 	 */ | ||||
| 	public UriComponentsBuilder withController(Class<?> controllerType) { | ||||
|  | @ -635,6 +676,8 @@ public class MvcUriComponentsBuilder { | |||
| 	/** | ||||
| 	 * An alternative to {@link #fromMethodName(Class, String, Object...)}} for | ||||
| 	 * use with an instance of this class created via {@link #relativeTo}. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @since 4.2 | ||||
| 	 */ | ||||
| 	public UriComponentsBuilder withMethodName(Class<?> controllerType, String methodName, Object... args) { | ||||
|  | @ -644,6 +687,8 @@ public class MvcUriComponentsBuilder { | |||
| 	/** | ||||
| 	 * An alternative to {@link #fromMethodCall(Object)} for use with an instance | ||||
| 	 * of this class created via {@link #relativeTo}. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @since 4.2 | ||||
| 	 */ | ||||
| 	public UriComponentsBuilder withMethodCall(Object invocationInfo) { | ||||
|  | @ -653,6 +698,8 @@ public class MvcUriComponentsBuilder { | |||
| 	/** | ||||
| 	 * An alternative to {@link #fromMappingName(String)} for use with an instance | ||||
| 	 * of this class created via {@link #relativeTo}. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @since 4.2 | ||||
| 	 */ | ||||
| 	public MethodArgumentBuilder withMappingName(String mappingName) { | ||||
|  | @ -662,6 +709,8 @@ public class MvcUriComponentsBuilder { | |||
| 	/** | ||||
| 	 * An alternative to {@link #fromMethod(Class, Method, Object...)} | ||||
| 	 * for use with an instance of this class created via {@link #relativeTo}. | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 * @since 4.2 | ||||
| 	 */ | ||||
| 	public UriComponentsBuilder withMethod(Class<?> controllerType, Method method, Object... args) { | ||||
|  |  | |||
|  | @ -17,7 +17,6 @@ | |||
| package org.springframework.web.servlet.support; | ||||
| 
 | ||||
| import java.util.Enumeration; | ||||
| 
 | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| 
 | ||||
| import org.springframework.http.HttpRequest; | ||||
|  | @ -34,7 +33,17 @@ import org.springframework.web.util.UriUtils; | |||
| import org.springframework.web.util.UrlPathHelper; | ||||
| 
 | ||||
| /** | ||||
|  * A UriComponentsBuilder that extracts information from the HttpServletRequest. | ||||
|  * UriComponentsBuilder with additional static factory methods to create links | ||||
|  * based on the current HttpServletRequest. | ||||
|  * | ||||
|  * <p><strong>Note:</strong> This class extracts and uses values from the headers | ||||
|  * "Forwarded" (<a href="http://tools.ietf.org/html/rfc7239">RFC 7239</a>), | ||||
|  * or "X-Forwarded-Host", "X-Forwarded-Port", and "X-Forwarded-Proto" if | ||||
|  * "Forwarded" is not found, in order to reflect the client-originated protocol | ||||
|  * and address. As an alternative consider using the | ||||
|  * {@link org.springframework.web.filter.ForwardedHeaderFilter} to have such | ||||
|  * headers extracted once and removed, or removed only (without being used). | ||||
|  * See the reference for further information including security considerations. | ||||
|  * | ||||
|  * @author Rossen Stoyanchev | ||||
|  * @since 3.1 | ||||
|  | @ -71,6 +80,9 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { | |||
| 	/** | ||||
| 	 * Prepare a builder from the host, port, scheme, and context path of the | ||||
| 	 * given HttpServletRequest. | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 */ | ||||
| 	public static ServletUriComponentsBuilder fromContextPath(HttpServletRequest request) { | ||||
| 		ServletUriComponentsBuilder builder = initFromRequest(request); | ||||
|  | @ -85,6 +97,9 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { | |||
| 	 * will end with "/main". If the servlet is mapped otherwise, e.g. | ||||
| 	 * {@code "/"} or {@code "*.do"}, the result will be the same as | ||||
| 	 * if calling {@link #fromContextPath(HttpServletRequest)}. | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 */ | ||||
| 	public static ServletUriComponentsBuilder fromServletMapping(HttpServletRequest request) { | ||||
| 		ServletUriComponentsBuilder builder = fromContextPath(request); | ||||
|  | @ -97,6 +112,9 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { | |||
| 	/** | ||||
| 	 * Prepare a builder from the host, port, scheme, and path (but not the query) | ||||
| 	 * of the HttpServletRequest. | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 */ | ||||
| 	public static ServletUriComponentsBuilder fromRequestUri(HttpServletRequest request) { | ||||
| 		ServletUriComponentsBuilder builder = initFromRequest(request); | ||||
|  | @ -107,6 +125,9 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { | |||
| 	/** | ||||
| 	 * Prepare a builder by copying the scheme, host, port, path, and | ||||
| 	 * query string of an HttpServletRequest. | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 */ | ||||
| 	public static ServletUriComponentsBuilder fromRequest(HttpServletRequest request) { | ||||
| 		ServletUriComponentsBuilder builder = initFromRequest(request); | ||||
|  | @ -155,6 +176,9 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { | |||
| 	/** | ||||
| 	 * Same as {@link #fromContextPath(HttpServletRequest)} except the | ||||
| 	 * request is obtained through {@link RequestContextHolder}. | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 */ | ||||
| 	public static ServletUriComponentsBuilder fromCurrentContextPath() { | ||||
| 		return fromContextPath(getCurrentRequest()); | ||||
|  | @ -163,6 +187,9 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { | |||
| 	/** | ||||
| 	 * Same as {@link #fromServletMapping(HttpServletRequest)} except the | ||||
| 	 * request is obtained through {@link RequestContextHolder}. | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 */ | ||||
| 	public static ServletUriComponentsBuilder fromCurrentServletMapping() { | ||||
| 		return fromServletMapping(getCurrentRequest()); | ||||
|  | @ -171,6 +198,9 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { | |||
| 	/** | ||||
| 	 * Same as {@link #fromRequestUri(HttpServletRequest)} except the | ||||
| 	 * request is obtained through {@link RequestContextHolder}. | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 */ | ||||
| 	public static ServletUriComponentsBuilder fromCurrentRequestUri() { | ||||
| 		return fromRequestUri(getCurrentRequest()); | ||||
|  | @ -179,6 +209,9 @@ public class ServletUriComponentsBuilder extends UriComponentsBuilder { | |||
| 	/** | ||||
| 	 * Same as {@link #fromRequest(HttpServletRequest)} except the | ||||
| 	 * request is obtained through {@link RequestContextHolder}. | ||||
| 	 * | ||||
| 	 * <p><strong>Note:</strong> This method extracts values from "Forwarded" | ||||
| 	 * and "X-Forwarded-*" headers if found. See class-level docs. | ||||
| 	 */ | ||||
| 	public static ServletUriComponentsBuilder fromCurrentRequest() { | ||||
| 		return fromRequest(getCurrentRequest()); | ||||
|  |  | |||
|  | @ -3436,6 +3436,38 @@ with a base URL and then use the instance-based "withXxx" methods. For example: | |||
| ---- | ||||
| 
 | ||||
| 
 | ||||
| [[mvc-links-to-controllers-forwarded-headers]] | ||||
| === Working with "Forwarded" and "X-Forwarded-*" Headers | ||||
| 
 | ||||
| As a request goes through proxies such as load balancers the host, port, and | ||||
| scheme may change presenting a challenge for applications that need to create links | ||||
| to resources since the links should reflect the host, port, and scheme of the | ||||
| original request as seen from a client perspective. | ||||
| 
 | ||||
| https://tools.ietf.org/html/rfc7239[RFC 7239] defines the "Forwarded" HTTP header | ||||
| for proxies to use to provide information about the original request. There are also | ||||
| other non-standard headers in use such as "X-Forwarded-Host", "X-Forwarded-Port", | ||||
| and "X-Forwarded-Proto". | ||||
| 
 | ||||
| Both `ServletUriComponentsBuilder` and `MvcUriComponentsBuilder` detect, extract, and use | ||||
| information from the "Forwarded" header, or from "X-Forwarded-Host", "X-Forwarded-Port", | ||||
| and "X-Forwarded-Proto" if "Forwarded" is not present, so that the resulting links reflect | ||||
| the original request. | ||||
| 
 | ||||
| The `ForwardedHeaderFilter` provides an alternative to do the same once and globally for | ||||
| the entire application. The filter wraps the request in order to overlay host, port, and | ||||
| scheme information and also "hides" any forwarded headers for subsequent processing. | ||||
| 
 | ||||
| Note that there are security considerations when using forwarded headers as explained | ||||
| in Section 8 of RFC 7239. At the application level it is difficult to determine whether | ||||
| forwarded headers can be trusted or not. This is why the network upstream should be | ||||
| configured correctly to filter out untrusted forwarded headers from the outside. | ||||
| 
 | ||||
| Applications that don't have a proxy and don't need to use forwarded headers can | ||||
| configure the `ForwardedHeaderFilter` to remove and ignore such headers. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| [[mvc-links-to-controllers-from-views]] | ||||
| === Building URIs to Controllers and methods from views | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue