spring cloud/spring boot同時(shí)支持http和https訪問
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
? 作者?|??涼瓜皮?
來源 |? urlify.cn/JnmYJv
66套java從入門到精通實(shí)戰(zhàn)課程分享
前言
關(guān)于spring boot同時(shí)支持http和https訪問,在spring boot官網(wǎng)73.9已經(jīng)有說明文檔了,同樣在github上也有官網(wǎng)的例子。
在這里,我向大家講述一下,我是怎么實(shí)現(xiàn)的。
方式一
一、相關(guān)配置
server:
??port:?4000
https:
??port:?8443
??ssl:
????key-store:?classpath:sample.jks
????key-store-password:?secret
????key-password:?password
可以看到,只是簡(jiǎn)簡(jiǎn)單單添加端口的信息,sample.jks可以自己生成(記得對(duì)應(yīng)密碼),也可以在官網(wǎng)例子里面下載。
二、spring boot啟動(dòng)文件讀取配置信息(注:請(qǐng)?zhí)砑颖匾膉ar)
@SpringBootApplication
public?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;????/*?--------------------請(qǐng)按照自己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;??}??/*?-------------------請(qǐng)按照自己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)項(xiàng)目后,可以看到兩個(gè)端口,說明已經(jīng)成功

方式二
一、相關(guān)配置
server:
??port:?8443
??ssl:
????key-store:?classpath:sample.jks
????key-store-password:?secret
????key-password:?password
http:
??port:?8080
二、spring boot啟動(dòng)文件讀取配置信息(注:請(qǐng)?zhí)砑颖匾膉ar)
@SpringBootApplication
public?class?SampleTomcatTwoConnectorsApplication?{
????@Value("${http.port}")
????private?Integer?port;
??/*?--------------------請(qǐng)按照自己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;??}
/*?--------------------請(qǐng)按照自己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)項(xiàng)目后,可以看到兩個(gè)端口,說明已經(jīng)成功
?
總結(jié)
對(duì)比兩種方法可以看出方式二比方式一簡(jiǎn)單一點(diǎn),主要是因?yàn)榉绞蕉玫拇a比較少,我也不知道這兩種方式有什么區(qū)別,我自己測(cè)試過,無論是spring boot還是spring cloud,這兩個(gè)方式都沒問題,就算是方式二,同樣可以幫服務(wù)注冊(cè)到eureka上。不一樣的是方式一注冊(cè)到eureka的端口是4000,方式二注冊(cè)到eureka的端口是8443。作為一個(gè)強(qiáng)迫的人士,在我自己的項(xiàng)目上,用的方式二,因?yàn)槲业膃ureka用的http注冊(cè)服務(wù)。如果你只是spring boot,當(dāng)然選擇少一點(diǎn)代碼的方式二啦。
這只是我在做項(xiàng)目時(shí),遇到的需求,拉出來給大家分享,如果發(fā)現(xiàn)問題,請(qǐng)大家提一下意見,讓我完善一下,謝謝
粉絲福利:108本java從入門到大神精選電子書領(lǐng)取
???
?長(zhǎng)按上方鋒哥微信二維碼?2 秒 備注「1234」即可獲取資料以及 可以進(jìn)入java1234官方微信群
感謝點(diǎn)贊支持下哈?
