Prevent reverse name lookup when configuring Jetty's address

Previously, the host on Jetty's connector was configured using the
host address of the InetSocketAddress. This could result in reverse
name resolution that could cause Jetty to bind to a different IP
address than was configured.

This commit updates the configuration code to use the host string
when specifically does not perform reverse name resolution.

See gh-11889
pull/11981/merge
Henrich Kraemer 7 years ago committed by Stephane Nicoll
parent 21eb8d89bb
commit dc48a90184

@ -101,6 +101,8 @@ import org.springframework.util.StringUtils;
* @author Eddú Meléndez * @author Eddú Meléndez
* @author Venil Noronha * @author Venil Noronha
* @author Henri Kerola * @author Henri Kerola
* @author Henrich Krämer
*
* @see #setPort(int) * @see #setPort(int)
* @see #setConfigurations(Collection) * @see #setConfigurations(Collection)
* @see JettyEmbeddedServletContainer * @see JettyEmbeddedServletContainer
@ -895,7 +897,7 @@ public class JettyEmbeddedServletContainerFactory
ReflectionUtils.findMethod(connectorClass, "setPort", int.class) ReflectionUtils.findMethod(connectorClass, "setPort", int.class)
.invoke(connector, address.getPort()); .invoke(connector, address.getPort());
ReflectionUtils.findMethod(connectorClass, "setHost", String.class) ReflectionUtils.findMethod(connectorClass, "setHost", String.class)
.invoke(connector, address.getHostName()); .invoke(connector, address.getHostString());
if (acceptors > 0) { if (acceptors > 0) {
ReflectionUtils.findMethod(connectorClass, "setAcceptors", int.class) ReflectionUtils.findMethod(connectorClass, "setAcceptors", int.class)
.invoke(connector, acceptors); .invoke(connector, acceptors);
@ -924,7 +926,7 @@ public class JettyEmbeddedServletContainerFactory
public AbstractConnector createConnector(Server server, InetSocketAddress address, public AbstractConnector createConnector(Server server, InetSocketAddress address,
int acceptors, int selectors) { int acceptors, int selectors) {
ServerConnector connector = new ServerConnector(server, acceptors, selectors); ServerConnector connector = new ServerConnector(server, acceptors, selectors);
connector.setHost(address.getHostName()); connector.setHost(address.getHostString());
connector.setPort(address.getPort()); connector.setPort(address.getPort());
for (ConnectionFactory connectionFactory : connector for (ConnectionFactory connectionFactory : connector
.getConnectionFactories()) { .getConnectionFactories()) {

@ -17,6 +17,7 @@
package org.springframework.boot.context.embedded.jetty; package org.springframework.boot.context.embedded.jetty;
import java.io.IOException; import java.io.IOException;
import java.net.InetAddress;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Arrays; import java.util.Arrays;
import java.util.Locale; import java.util.Locale;
@ -35,6 +36,8 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.apache.jasper.servlet.JspServlet; import org.apache.jasper.servlet.JspServlet;
import org.eclipse.jetty.server.AbstractNetworkConnector;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.ServerConnector;
@ -114,6 +117,32 @@ public class JettyEmbeddedServletContainerFactoryTests
} }
} }
@Test
public void specificIPAddressNotReverseResolved() throws Exception {
JettyEmbeddedServletContainerFactory factory = getFactory();
final String[] refAncHost = new String[1];
refAncHost[0] = "HostNotSetInAbstractNetworkConnector";
InetAddress lhAddress = InetAddress.getLocalHost();
InetAddress address = InetAddress.getByAddress(lhAddress.getAddress());
// the address should have no host name associated with ith
String expectedHost = address.getHostAddress();
factory.setAddress(address);
factory.addServerCustomizers(server -> {
for (Connector connector : server.getConnectors()) {
if (connector instanceof AbstractNetworkConnector) {
@SuppressWarnings("resource")
AbstractNetworkConnector anc = (AbstractNetworkConnector) connector;
String ancHost = anc.getHost();
refAncHost[0] = ancHost;
break;
}
}
});
this.container = factory
.getEmbeddedServletContainer(exampleServletRegistration());
assertThat(refAncHost[0]).isEqualTo(expectedHost);
}
@Test @Test
public void sessionTimeout() throws Exception { public void sessionTimeout() throws Exception {
JettyEmbeddedServletContainerFactory factory = getFactory(); JettyEmbeddedServletContainerFactory factory = getFactory();

Loading…
Cancel
Save