前言
關(guān)于spring boot同時(shí)支持http和https訪(fǎng)問(wèn),在spring boot官網(wǎng)73.9已經(jīng)有說(shuō)明文檔了,同樣在github上也有官網(wǎng)的例子。
在這里,我向大家講述一下,我是怎么實(shí)現的。
方式一
一、相關(guān)配置
server: port: 4000https: port: 8443 ssl: key-store: classpath:sample.jks key-store-password: secret key-password: password
可以看到,只是簡(jiǎn)簡(jiǎn)單單添加端口的信息,sample.jks可以自己生成(記得對應密碼),也可以在官網(wǎng)例子里面下載。
二、spring boot啟動(dòng)文件讀取配置信息(注:請添加必要的jar)
@SpringBootApplicationpublic class GatewayApplication { public static void main(String[] args) throws Exception { SpringApplication.run(GatewayApplication.class, args); } @Value("${https.port}") private Integer port; @Value("${https.ssl.key-store-password}") private String key_store_password; @Value("${https.ssl.key-password}") private String key_password;
/* --------------------請按照自己spring boot版本選擇 start--------------------- */
// 這是spring boot 1.5.X以下版本的 添加了這個(gè),下一個(gè)就不用添加了 @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); tomcat.addAdditionalTomcatConnectors(createSslConnector()); // 添加http return tomcat; }
// 這是spring boot 2.0.X版本的 添加這個(gè),上一個(gè)就不用添加了
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createSslConnector()); // 添加http
return tomcat;
}
/* -------------------請按照自己spring boot版本選擇 end---------------------- */
// 配置https private Connector createSslConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); try { File keystore = new ClassPathResource("sample.jks").getFile(); /*File truststore = new ClassPathResource("sample.jks").getFile();*/ connector.setScheme("https"); connector.setSecure(true); connector.setPort(port); protocol.setSSLEnabled(true); protocol.setKeystoreFile(keystore.getAbsolutePath()); protocol.setKeystorePass(key_store_password); protocol.setKeyPass(key_password); return connector; } catch (IOException ex) { throw new IllegalStateException("can't access keystore: [" + "keystore" + "] or truststore: [" + "keystore" + "]", ex); } }}
啟動(dòng)項目后,可以看到兩個(gè)端口,說(shuō)明已經(jīng)成功

方式二
一、相關(guān)配置
server: port: 8443 ssl: key-store: classpath:sample.jks key-store-password: secret key-password: passwordhttp: port: 8080
二、spring boot啟動(dòng)文件讀取配置信息(注:請添加必要的jar)
@SpringBootApplicationpublic class SampleTomcatTwoConnectorsApplication { @Value("${http.port}") private Integer port;
/* --------------------請按照自己spring boot版本選擇 start--------------------- */
// 這是spring boot 1.5.X以下版本的 添加了這個(gè),下一個(gè)就不用添加了 @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加http return tomcat; }
// 這是spring boot 2.0.X版本的 添加這個(gè),上一個(gè)就不用添加了
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加http
return tomcat;
}
/* --------------------請按照自己spring boot版本選擇 end--------------------- */
// 配置http private Connector createStandardConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setPort(port); return connector; } public static void main(String[] args) throws Exception { SpringApplication.run(SampleTomcatTwoConnectorsApplication.class, args); }}
啟動(dòng)項目后,可以看到兩個(gè)端口,說(shuō)明已經(jīng)成功

總結
對比兩種方法可以看出方式二比方式一簡(jiǎn)單一點(diǎn),主要是因為方式二用的代碼比較少,我也不知道這兩種方式有什么區別,我自己測試過(guò),無(wú)論是spring boot還是spring cloud,這兩個(gè)方式都沒(méi)問(wèn)題,就算是方式二,同樣可以幫服務(wù)注冊到eureka上。不一樣的是方式一注冊到eureka的端口是4000,方式二注冊到eureka的端口是8443。作為一個(gè)強迫的人士,在我自己的項目上,用的方式二,因為我的eureka用的http注冊服務(wù)。如果你只是spring boot,當然選擇少一點(diǎn)代碼的方式二啦。
這只是我在做項目時(shí),遇到的需求,拉出來(lái)給大家分享,如果發(fā)現問(wèn)題,請大家提一下意見(jiàn),讓我完善一下,謝謝
聯(lián)系客服