Java Spring Boot 下配置HTTPS接口并實(shí)現(xiàn)HTTP訪問自動(dòng)轉(zhuǎn)向HTTPS(EmbeddedServletContainerFactory填坑)

  • 本文以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;

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宿刮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子特占,更是在濱河造成了極大的恐慌糙置,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是目,死亡現(xiàn)場(chǎng)離奇詭異谤饭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懊纳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門揉抵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嗤疯,你說我怎么就攤上這事冤今。” “怎么了茂缚?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵戏罢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我脚囊,道長(zhǎng)龟糕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任悔耘,我火速辦了婚禮讲岁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衬以。我一直安慰自己缓艳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布看峻。 她就那樣靜靜地躺著阶淘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪互妓。 梳的紋絲不亂的頭發(fā)上舶治,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音车猬,去河邊找鬼。 笑死尺锚,一個(gè)胖子當(dāng)著我的面吹牛珠闰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘫辩,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼伏嗜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼坛悉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起承绸,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤裸影,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后军熏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轩猩,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年荡澎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了均践。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摩幔,死狀恐怖彤委,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情或衡,我是刑警寧澤焦影,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站封断,受9級(jí)特大地震影響斯辰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澄港,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一椒涯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧回梧,春花似錦废岂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至详囤,卻和暖如春财骨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背藏姐。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工隆箩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人羔杨。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓捌臊,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親兜材。 傳聞我的和親對(duì)象是個(gè)殘疾皇子理澎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349