Spring Boot 如何同時支持 http 與 https 訪問?

原文鏈接:Spring Boot 如何同時支持 http 與 https 訪問?


大多數項目要麼要求 https 協議來訪問要麼直接用 http 協議,但有些項目就是這麼奇怪要求同時支持兩種協議。

此示例中使用Spring Boot 內置的 tomcat 服務器,我拿到的 SSL 證書是 crt 類型的。所有首先需要將證書轉成 jks 類型的。

crt 轉 jks

  # 轉p12
  openssl pkcs12 -export -out keystore.pkcs12 -inkey nexus.key -in nexus.crt
	
  # 這裏需要設置密碼
  # 再將p12格式文件轉爲.jks格式:
  keytool -v -importkeystore -srckeystore keystore.pkcs12 -srcstoretype PKCS12 -destkeystore 
  keystore.jks -deststoretype JKS
  # 輸入上步設置的密碼並設置新密碼 可以和上一步一樣的密碼

Windows 系統需要安裝 openssl 後纔可以執行上述命令。

安裝

將生成的 jks 文件放到項目的 resource 目錄下,開始配置 application.yml 文件。

server:
  port: 8888
  custom:
    # http 端口
    httpPort: 9999
  ssl:
    key-store: classpath:keystore.jks
    key-password: 123456
    key-store-type: JKS
  tomcat:
    uri-encoding: utf-8
    basedir: tmp
  #
  servlet:
    context-path: /

然後編寫 Https配置類:HttpConfig.java

import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author: ChangXuan
 * @Decription: 配置同時支持 HTTP 與 HTTPS 訪問
 * @Date: 19:39 2020/2/20
 **/
@Configuration
public class HttpsConfig {
    @Value("${server.custom.httpPort}")
    private Integer httpPort;

    @Bean
    public ServletWebServerFactory serverFactory() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createStandardConnector());
        return tomcat;
    }
    /**
     * 配置http
     * @return
     */
    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(httpPort);
        return connector;
    }
}

注意事項

application.yml 中配置的 jks 文件的目錄爲 classpath ,classpath 指的是 target/classes 目錄。所以運行時如果報錯“找不到 jks 文件”,就手動將 jks 文件複製到此目錄下一份。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章