@ -34,20 +34,23 @@ import org.springframework.http.HttpRequest;
@@ -34,20 +34,23 @@ import org.springframework.http.HttpRequest;
import org.springframework.http.server.ServletServerHttpRequest ;
import org.springframework.util.Assert ;
import org.springframework.util.CollectionUtils ;
import org.springframework.util.StringUtils ;
import org.springframework.web.util.UriComponents ;
import org.springframework.web.util.UriComponentsBuilder ;
import org.springframework.web.util.UrlPathHelper ;
/ * *
* Filter that wraps the request in order to override its
* { @link HttpServletRequest # getServerName ( ) getServerName ( ) } ,
* { @link HttpServletRequest # getServerPort ( ) getServerPort ( ) } ,
* { @link HttpServletRequest # getScheme ( ) getScheme ( ) } , and
* { @link HttpServletRequest # isSecure ( ) isSecure ( ) } methods with values derived
* from "Fowarded" or "X-Forwarded-*" headers . In effect the wrapped request
* from "For warded" or "X-Forwarded-*" headers . In effect the wrapped request
* reflects the client - originated protocol and address .
*
* @author Rossen Stoyanchev
* @author Eddú Meléndez
* @since 4 . 3
* /
public class ForwardedHeaderFilter extends OncePerRequestFilter {
@ -55,11 +58,12 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
@@ -55,11 +58,12 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
private static final Set < String > FORWARDED_HEADER_NAMES ;
static {
FORWARDED_HEADER_NAMES = new HashSet < String > ( 4 ) ;
FORWARDED_HEADER_NAMES = new HashSet < String > ( 5 ) ;
FORWARDED_HEADER_NAMES . add ( "Forwarded" ) ;
FORWARDED_HEADER_NAMES . add ( "X-Forwarded-Host" ) ;
FORWARDED_HEADER_NAMES . add ( "X-Forwarded-Port" ) ;
FORWARDED_HEADER_NAMES . add ( "X-Forwarded-Proto" ) ;
FORWARDED_HEADER_NAMES . add ( "X-Forwarded-Prefix" ) ;
}
@ -131,6 +135,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
@@ -131,6 +135,7 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
private final Map < String , List < String > > headers ;
public ForwardedHeaderRequestWrapper ( HttpServletRequest request , ContextPathHelper pathHelper ) {
super ( request ) ;
@ -143,13 +148,23 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
@@ -143,13 +148,23 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
this . host = uriComponents . getHost ( ) ;
this . port = ( port = = - 1 ? ( this . secure ? 443 : 80 ) : port ) ;
this . contextPath = ( pathHelper ! = null ? pathHelper . getContextPath ( request ) : request . getContextPath ( ) ) ;
this . requestUri = ( pathHelper ! = null ? pathHelper . getRequestUri ( request ) : request . getRequestURI ( ) ) ;
this . contextPath = initContextPath ( request , pathHelper ) ;
this . requestUri = initRequestUri ( request , pathHelper ) ;
this . requestUrl = initRequestUrl ( this . scheme , this . host , port , this . requestUri ) ;
this . headers = initHeaders ( request ) ;
}
private static String initContextPath ( HttpServletRequest request , ContextPathHelper pathHelper ) {
String contextPath = ( pathHelper ! = null ? pathHelper . getContextPath ( request ) : request . getContextPath ( ) ) ;
return prependForwardedPrefix ( request , contextPath ) ;
}
private static String initRequestUri ( HttpServletRequest request , ContextPathHelper pathHelper ) {
String requestUri = ( pathHelper ! = null ? pathHelper . getRequestUri ( request ) : request . getRequestURI ( ) ) ;
return prependForwardedPrefix ( request , requestUri ) ;
}
private static StringBuffer initRequestUrl ( String scheme , String host , int port , String path ) {
StringBuffer sb = new StringBuffer ( ) ;
sb . append ( scheme ) . append ( "://" ) . append ( host ) ;
@ -174,6 +189,17 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
@@ -174,6 +189,17 @@ public class ForwardedHeaderFilter extends OncePerRequestFilter {
return headers ;
}
private static String prependForwardedPrefix ( HttpServletRequest request , String value ) {
String header = request . getHeader ( "X-Forwarded-Prefix" ) ;
if ( StringUtils . hasText ( header ) ) {
while ( header . endsWith ( "/" ) ) {
header = header . substring ( 0 , header . length ( ) - 1 ) ;
}
value = header + value ;
}
return value ;
}
@Override
public String getScheme ( ) {