天天看點

讓你的Spring Boot工程支援HTTP和HTTPS

如今,企業級應用程式的常見場景是同時支援http和https兩種協定,這篇文章考慮如何讓spring boot應用程式同時支援http和https兩種協定。

為了使用https連接配接器,需要生成一份certificate keystore,用于加密和機密浏覽器的ssl溝通。

如果你使用unix或者mac os,可以通過下列指令:<code>keytool -genkey -alias tomcat -keyalg rsa</code>,在生成過程中可能需要你填入一些自己的資訊,例如我的機器上回報如下:

讓你的Spring Boot工程支援HTTP和HTTPS

生成kestore

可以看出,執行完上述指令後在home目錄下多了一個新的.keystore檔案。

首先在resources目錄下建立一個配置檔案tomcat.https.properties,用于存放https的配置資訊;

然後在webconfiguration類中建立一個靜态類tomcatsslconnectorproperties;

通過注解加載tomcat.https.properties配置檔案,并與tomcatsslconnectorproperties綁定,用注解修飾webconfiguration類;

在webconfiguration類中建立embeddedservletcontainerfactory類型的srping bean,并用它添加之前建立的https連接配接器。

通過<code>mvn spring-boot:run</code>啟動應用程式;

在浏覽器中通路url<code>https://localhost:8443/internal/tomcat.https.properties</code>

讓你的Spring Boot工程支援HTTP和HTTPS

支援https協定

在浏覽器中通路url<code>http://localhost:8080/internal/application.properties</code>

讓你的Spring Boot工程支援HTTP和HTTPS

同時支援http協定

是以我們這裡建立一個配置檔案tomcat.https.properties來實作,但是這并不符合“spring boot風格”,後續有可能應該會支援“通過application.properties同時配置http連接配接器和https連接配接器”。我添加的tomcatsslconnectorproperties是模仿spring boot中的serverproperties的使用機制實作的,這裡使用了自定義的屬性字首custom.tomcat而沒有用現有的server.字首,因為serverproperties禁止在其他的配置檔案中使用該命名空間。

@configurationproperties(prefix = "custom.tomcat.https")這個注解會讓spring boot自動将custom.tomcat.https開頭的屬性綁定到tomcatsslconnectorproperties這個類的成員上(確定該類的getters和setters存在)。值得一提的是,在綁定過程中spring boot會自動将屬性值轉換成合适的資料類型,例如custom.tomcat.https.keystore的值會自動綁定到file對象keystore上。

使用@propertysource("classpath:/tomcat.https.properties")來讓spring boot加載tomcat.https.properties檔案中的屬性。

使用@enableconfigurationproperties(webconfiguration.tomcatsslconnectorproperties.class)讓spring boot自動建立一個屬性對象,包含上述通過@propertysource導入的屬性。

在屬性值導入記憶體,并建構好tomcatsslconnectorproperties執行個體後,需要建立一個embeddedservletcontainerfactory類型的spring bean,用于建立embeddedservletcontainer。

通過createsslconnector方法可以建構一個包含了我們指定的屬性值的連接配接器,然後通過tomcat.addadditionaltomcatconnectors(createsslconnector(properties));設定tomcat容器的https連接配接器。

<a href="https://qbgbook.gitbooks.io/spring-boot-reference-guide-zh/content/ix.%20%e2%80%98how-to%e2%80%99%20guides/64.5.%20configure%20ssl.html" target="_blank">配置ssl</a>