From 05b501ce41747e494706fb7eb74326dfc6d6b761 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 30 Oct 2015 09:05:24 +0000 Subject: [PATCH] Update Tomcat multi-connectors sample to configure SSL declaratively The documentation recommends configuring the HTTP connector in code and using application.properties to configure the HTTPS connector as it's easier. This commit updates the sample to follow that recommendation. Closes gh-4342 --- .../SampleTomcatTwoConnectorsApplication.java | 45 ++---------------- .../src/main/resources/application.properties | 4 ++ .../src/main/resources/keystore | Bin 3602 -> 0 bytes .../src/main/resources/sample.jks | Bin 0 -> 2264 bytes ...leTomcatTwoConnectorsApplicationTests.java | 15 +++--- 5 files changed, 17 insertions(+), 47 deletions(-) create mode 100644 spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/resources/application.properties delete mode 100644 spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/resources/keystore create mode 100644 spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/resources/sample.jks diff --git a/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/java/sample/tomcat/SampleTomcatTwoConnectorsApplication.java b/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/java/sample/tomcat/SampleTomcatTwoConnectorsApplication.java index 65bd6a958fd..24d5f6e151a 100644 --- a/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/java/sample/tomcat/SampleTomcatTwoConnectorsApplication.java +++ b/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/java/sample/tomcat/SampleTomcatTwoConnectorsApplication.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,26 +16,20 @@ package sample.tomcat; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; - import org.apache.catalina.connector.Connector; -import org.apache.coyote.http11.Http11NioProtocol; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.context.annotation.Bean; -import org.springframework.core.io.ClassPathResource; -import org.springframework.util.FileCopyUtils; import org.springframework.util.SocketUtils; /** - * Sample Application to show Tomcat running 2 connectors + * Sample Application to show Tomcat running two connectors * * @author Brock Mills + * @author Andy Wilkinson */ @SpringBootApplication public class SampleTomcatTwoConnectorsApplication { @@ -54,37 +48,8 @@ public class SampleTomcatTwoConnectorsApplication { private Connector createSslConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); - Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); - try { - File keystore = getKeyStoreFile(); - File truststore = keystore; - connector.setScheme("https"); - connector.setSecure(true); - connector.setPort(port()); - protocol.setSSLEnabled(true); - protocol.setKeystoreFile(keystore.getAbsolutePath()); - protocol.setKeystorePass("changeit"); - protocol.setTruststoreFile(truststore.getAbsolutePath()); - protocol.setTruststorePass("changeit"); - protocol.setKeyAlias("apitester"); - return connector; - } - catch (IOException ex) { - throw new IllegalStateException("cant access keystore: [" + "keystore" - + "] or truststore: [" + "keystore" + "]", ex); - } - } - - private File getKeyStoreFile() throws IOException { - ClassPathResource resource = new ClassPathResource("keystore"); - try { - return resource.getFile(); - } - catch (Exception ex) { - File temp = File.createTempFile("keystore", ".tmp"); - FileCopyUtils.copy(resource.getInputStream(), new FileOutputStream(temp)); - return temp; - } + connector.setPort(port()); + return connector; } public static void main(String[] args) throws Exception { diff --git a/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/resources/application.properties b/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/resources/application.properties new file mode 100644 index 00000000000..37199bfd256 --- /dev/null +++ b/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/resources/application.properties @@ -0,0 +1,4 @@ +server.port = 8443 +server.ssl.key-store = classpath:sample.jks +server.ssl.key-store-password = secret +server.ssl.key-password = password diff --git a/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/resources/keystore b/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/resources/keystore deleted file mode 100644 index 6547e5b51944ab7e0456d7ae86768967d01fc45a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3602 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 literal 0 HcmV?d00001 diff --git a/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/test/java/sample/tomcat/SampleTomcatTwoConnectorsApplicationTests.java b/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/test/java/sample/tomcat/SampleTomcatTwoConnectorsApplicationTests.java index 55e479a624c..2d9465d20c6 100644 --- a/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/test/java/sample/tomcat/SampleTomcatTwoConnectorsApplicationTests.java +++ b/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/test/java/sample/tomcat/SampleTomcatTwoConnectorsApplicationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2014 the original author or authors. + * Copyright 2012-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,9 +46,10 @@ import org.springframework.web.client.RestTemplate; import static org.junit.Assert.assertEquals; /** - * Basic integration tests for 2 connector demo application. + * Basic integration tests for {@link SampleTomcatTwoConnectorsApplication}. * * @author Brock Mills + * @author Andy Wilkinson */ @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = SampleTomcatTwoConnectorsApplication.class) @@ -109,14 +110,14 @@ public class SampleTomcatTwoConnectorsApplicationTests { }); template.setRequestFactory(factory); - ResponseEntity entity = template - .getForEntity("http://localhost:" + this.port + "/hello", String.class); + ResponseEntity entity = template.getForEntity( + "http://localhost:" + this.context.getBean("port") + "/hello", + String.class); assertEquals(HttpStatus.OK, entity.getStatusCode()); assertEquals("hello", entity.getBody()); - ResponseEntity httpsEntity = template.getForEntity( - "https://localhost:" + this.context.getBean("port") + "/hello", - String.class); + ResponseEntity httpsEntity = template + .getForEntity("https://localhost:" + this.port + "/hello", String.class); assertEquals(HttpStatus.OK, httpsEntity.getStatusCode()); assertEquals("hello", httpsEntity.getBody());