diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java index 40004ab7ec..421e24488c 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java @@ -207,9 +207,11 @@ public class ServerProperties implements EmbeddedServletContainerCustomizer { + "169\\.254\\.\\d{1,3}\\.\\d{1,3}|" // 169.254/16 + "127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"; // 127/8 - private String protocolHeader = "x-forwarded-proto"; + private String protocolHeader; - private String remoteIpHeader = "x-forwarded-for"; + private String portHeader; + + private String remoteIpHeader; private File basedir; @@ -285,6 +287,14 @@ public class ServerProperties implements EmbeddedServletContainerCustomizer { this.protocolHeader = protocolHeader; } + public String getPortHeader() { + return this.portHeader; + } + + public void setPortHeader(String portHeader) { + this.portHeader = portHeader; + } + public String getRemoteIpHeader() { return this.remoteIpHeader; } @@ -321,6 +331,7 @@ public class ServerProperties implements EmbeddedServletContainerCustomizer { valve.setRemoteIpHeader(remoteIpHeader); valve.setProtocolHeader(protocolHeader); valve.setInternalProxies(getInternalProxies()); + valve.setPortHeader(getPortHeader()); factory.addContextValves(valve); } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java index 0f0b936069..66f75e8604 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java @@ -147,6 +147,12 @@ public class ServerPropertiesTests { @Test public void defaultTomcatRemoteIpValve() throws Exception { + Map map = new HashMap(); + // Since 1.1.7 you need to specify at least the protocol and ip properties + map.put("server.tomcat.protocol_header", "x-forwarded-proto"); + map.put("server.tomcat.remote_ip_header", "x-forwarded-for"); + bindProperties(map); + TomcatEmbeddedServletContainerFactory container = new TomcatEmbeddedServletContainerFactory(); this.properties.customize(container); @@ -171,6 +177,7 @@ public class ServerPropertiesTests { map.put("server.tomcat.remote_ip_header", "x-my-remote-ip-header"); map.put("server.tomcat.protocol_header", "x-my-protocol-header"); map.put("server.tomcat.internal_proxies", "192.168.0.1"); + map.put("server.tomcat.port-header", "x-my-forward-port"); bindProperties(map); TomcatEmbeddedServletContainerFactory container = new TomcatEmbeddedServletContainerFactory(); @@ -182,6 +189,7 @@ public class ServerPropertiesTests { RemoteIpValve remoteIpValve = (RemoteIpValve) valve; assertEquals("x-my-protocol-header", remoteIpValve.getProtocolHeader()); assertEquals("x-my-remote-ip-header", remoteIpValve.getRemoteIpHeader()); + assertEquals("x-my-forward-port", remoteIpValve.getPortHeader()); assertEquals("192.168.0.1", remoteIpValve.getInternalProxies()); } diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc index 7b004a4aad..8f4d8ab877 100644 --- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc +++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc @@ -74,7 +74,8 @@ content into your application; rather pick only the properties that you need. 192\.168\.\d{1,3}\.\d{1,3}|\ 169\.254\.\d{1,3}\.\d{1,3}|\ 127\.\d{1,3}\.\d{1,3}\.\d{1,3} # regular expression matching trusted IP addresses - server.tomcat.protocol-header=x-forwarded-proto # ssl forward headers + server.tomcat.protocol-header=x-forwarded-proto # front end proxy forward header + server.tomcat.port-header= # front end proxy port header server.tomcat.remote-ip-header=x-forwarded-for server.tomcat.basedir=/tmp # base dir (usually not needed, defaults to tmp) server.tomcat.background-processor-delay=30; # in seconds