- 本文以Spring Boot2.x為例奶浦,文末會(huì)介紹Spring Boot1.x的相關(guān)方法
- 寫在題首:現(xiàn)在網(wǎng)上大多關(guān)于這點(diǎn)的教程是以Spring Boot1.x為例宇整,所以作者在寫代碼的過程中發(fā)現(xiàn)其中用到的類
EmbeddedServletContainerFactory
找不到,幾經(jīng)查找發(fā)現(xiàn)此類在Spring Boot2.x 中已經(jīng)廢棄,改為TomcatServletWebServerFactory
在默認(rèn)情況下我們創(chuàng)建一個(gè) Java Spring Boot 的后臺(tái)工程宣脉,并配置了端口(此處以port:8085為例)之后,便可以制作一個(gè)接口共外部訪問剔氏,例如:
@RestController
public class TestController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String testIndex() {
return "這是hanxun商城后臺(tái)的測(cè)試接口塑猖!";
}
}
此時(shí)我們就可以在本機(jī)瀏覽器中通過
http://localhost:8075/hello
的方式來調(diào)用該接口,當(dāng)然這種情況下默認(rèn)的接口類型是Http
的谈跛。這時(shí)候如果我們希望將這種接口改為Https
類型的羊苟,可做如下配置:。
證書生成
使用SSL需要我們先生成一個(gè)證書感憾,這個(gè)證書我們可以自己生成蜡励,也可以從SSL證書授權(quán)中心獲得,自己生成的不被客戶端認(rèn)可,從授權(quán)中心獲得的可以被客戶端認(rèn)可凉倚,提供SSL授權(quán)證書的服務(wù)商有很多兼都,小伙伴們有興趣可以自行查找,我這里以自己生成的證書為例稽寒。 生成方式也很簡(jiǎn)單扮碧,直接使用java自帶的命令keytool來生成,生成命令如下:
`keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650`
此處涉及到的幾個(gè)參數(shù)含義如下:
1. -storetype 指定密鑰倉(cāng)庫(kù)類型
2. -keyalg 生證書的算法名稱杏糙,RSA是一種非對(duì)稱加密算法
3. -keysize 證書大小
4. -keystore 生成的證書文件的存儲(chǔ)路徑
5. -validity 證書的有效期
在此命令執(zhí)行過程中會(huì)出現(xiàn)以下內(nèi)容:
輸入密鑰庫(kù)口令:
密鑰庫(kù)口令太短 - 至少必須為 6 個(gè)字符
輸入密鑰庫(kù)口令:
再次輸入新口令:
此處我輸入的口令(即證書的密碼):1234567890
這個(gè)在代碼中會(huì)用到慎王,需要牢記。
隨后出現(xiàn):
您的名字與姓氏是什么?
[Unknown]:
您的組織單位名稱是什么?
[Unknown]:
您的組織名稱是什么?
[Unknown]:
您所在的城市或區(qū)域名稱是什么?
[Unknown]:
您所在的省/市/自治區(qū)名稱是什么?
[Unknown]:
該單位的雙字母國(guó)家/地區(qū)代碼是什么?
[Unknown]:
CN=Unknown, OU=hanxun, O=hanxun, L=Unknown, ST=Unknown, C=Unknown是否正確?
[否]: y
以上內(nèi)容可填寫也可不填宏侍,不填的話直接按下 回車 鍵 即可赖淤,在最后一步中想輸入 y
確定。至此负芋,證書生成的工作完成漫蛔。
工程文件代碼配置
在執(zhí)行完上面一行命令后,在你的系統(tǒng)的當(dāng)前用戶目錄下會(huì)生成一個(gè)keystore.p12文件(如果你修改了證書文件的名稱那就是你 修改的名字.p12
)旧蛾,將這個(gè)文件拷貝到我們項(xiàng)目的根目錄下莽龟,然后修改application.properties
文件或是 application.yml
文件,添加HTTPS支持锨天。在上面提到的問價(jià)中添加如下代碼:
server:
ssl: key-store: keystore.p12
key-store-password: 1234567890
key-store-type: PKCS12
key-alias: tomcat
此處毯盈,keystore.p12
為上文中生成的證書文件,并以此來指定簽名文件病袄, 1234567890
為命令中輸入的證書口令搂赋,key-store-type
為指定秘鑰倉(cāng)庫(kù)的類型,key-alias
是指定別名益缠。
通過以上的配置之后我們便可以在瀏覽器中 通過HTTPS
的方式來訪問接口了脑奠,訪問結(jié)果如下所示如下:
圖中的端口8075
為本文開始處設(shè)置的端口。
配置HTTP自動(dòng)轉(zhuǎn)向HTTPS
進(jìn)行到這里通過Https
來訪問沒有問題了幅慌,但是不可避免的宋欺。有些用戶并不知道這是個(gè) Https
接口,還是會(huì)使用Http
來訪問胰伍,這是瀏覽器中就會(huì)報(bào)錯(cuò)齿诞,如下圖所示:
這個(gè)時(shí)候我們需要添加HTTP自動(dòng)轉(zhuǎn)向HTTPS的功能,當(dāng)用戶使用HTTP來進(jìn)行訪問的時(shí)候自動(dòng)轉(zhuǎn)為HTTPS的方式骂租。這個(gè)配置很簡(jiǎn)單祷杈,在入口類中添加相應(yīng)的轉(zhuǎn)向Bean就行了,如下:
/**
*@Despription HTTP自動(dòng)轉(zhuǎn)向HTTPS 設(shè)置1
*@Params
*@return
*@Created Charles.Zhang
*@Time 2018/8/29
*@Modify
*/
@Bean
public Connector connector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8075);
return connector;
}
/**
*@Despription HTTP自動(dòng)轉(zhuǎn)向HTTPS 設(shè)置2
*@Params
*@return
*@Created Charles.Zhang
*@Time 2018/8/29
*@Modify
*/
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory(){
TomcatServletWebServerFactory tomcat =new TomcatServletWebServerFactory(){
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint=new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection=new SecurityCollection();
collection.addPattern("/");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(connector());
return tomcat;
}
這個(gè)時(shí)候當(dāng)我們?cè)L問http://localhost:8080的時(shí)候系統(tǒng)會(huì)自動(dòng)重定向到https://localhost:8075這個(gè)地址上渗饮。
Spring boot1.x
下的配置 EmbeddedServletContainerFactory
這里用到的類是:TomcatServletWebServerFactory
但汞,但是在 Spring boot1.x
下 使用的是 EmbeddedServletContainerFactory
,下面將在 Spring boot1.x
下的用法展示如下:
@Bean
public Connector connector(){
Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8075);
return connector;
}
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomca t= new TomcatEmbeddedServletContainerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint constraint = new SecurityConstraint();
constraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/");
constraint.addCollection(collection);
context.addConstraint(constraint);
}
};
tomcat.addAdditionalTomcatConnectors(connector());
return tomcat;
}