springboot+https+http


http訪問不安全,使用https相對好些。

參考網址:https://blog.csdn.net/bock1984/article/details/90116965

操作如下:

  • 1. 使用JDK自帶keytool工具,創建本地SSL證書

 啟動命令行工具,進入jdk的bin目錄執行以下命令:
       

keytool -genkey -v -alias tomcat -keyalg RSA -keystore F:\tomcat.keystore -validity 36500

1
.-keyalg 生證書的算法名稱,RSA是一種非對稱加密算法 2.-keystore 生成的證書文件的存儲路徑 3.-validity 證書的有效期

 

在這里插入圖片描述

  • 2.將生成的tomcat.keystore文件拷貝到springboot項目根目錄下:

在這里插入圖片描述

  • 3.修改application.properties文件

·

 看application.properties配置文件可知,后面只能用https協議訪問了。

1) http訪問自動轉https

(用戶前期用http協議,突然改成只用https訪問,這樣有的客戶還用http訪問時就訪問不到服務器了,針對這種情況可做http訪問自動轉到https)

光有HTTPS肯定還不夠,很多用戶可能並不知道,用戶有可能繼續使用HTTP來訪問你的網站,這個時候我們需要添加HTTP自動轉向HTTPS的功能,當用戶使用HTTP來進行訪問的時候自動轉為HTTPS的方式。
(這個是springboot2.x的配置,sprintboot1.x有些不一樣 區別就是 1.0用 EmbeddedServletContainerFactory ,,,2.0用 TomcatServletWebServerFactory
(另也可以不用新建這個配置類,而是在入口類中添加下面這兩個Bean就行了)
package com.nsoft.gkzp.syscore.config;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/**
 * 監聽http端口,如訪問網址為http協議的,自動轉換為Https
 */
@Configuration
@PropertySource(value="classpath:application.properties")
public class HttpsComponent {

    //讀取application.properties配置文件配置的https訪問端口號
    @Value("${server.port}")
    public  int SYSTEM_HTTPS_PORT;
    //讀取application.properties配置文件配置的http監控端口(自動轉換為https)
    @Value("${server.http.port}")
    public  int SYSTEM_HTTP_PORT;

    @Bean
    public Connector connector(){

        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(SYSTEM_HTTP_PORT);//Connector監聽的http的端口號
        connector.setSecure(false);
        connector.setRedirectPort(SYSTEM_HTTPS_PORT);//監聽到http的端口號后轉向到的https的端口號(一般會用443端口)
        return connector;
    }

    @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;
    }
}
package com.nsoft.gkzp.syscore.config;

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 監聽http端口,如訪問網址為http協議的,自動轉換為Https
 */
@Configuration
public class HttpsComponent {

    @Bean
    public Connector connector(){

        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8082);//Connector監聽的http的端口號
        connector.setSecure(false);
        connector.setRedirectPort(8443);//監聽到http的端口號后轉向到的https的端口號(一般會用443端口)
        return connector;
    }

    @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;
    }
}
直接寫端口號,理解更直觀些

另:

這邊自己生成的證書,是不被公網認證的。如下圖。要想公網認證,需要去網上相關機構的去買(將域名提供給他們,他們生成公網可認證的證書),便宜點的大約一年一千多塊錢吧。

 

 

2) 同時支持http和https訪問

(參考 : https://blog.csdn.net/qq_38288606/article/details/89478353

 注意:Spring Boot不支持通過application.properties同時配置HTTP連接器和HTTPS連接器

故我在application.properties配置了https相關配置,然后添加了一個自定義的server.http.port參數,然后新建httpComponent.java配置java類,來啟動http端口訪問

application.properties

 

 新建類D:\workspace-gzy-gkzp\src\main\java\com\nsoft\gkzp\syscore\config\httpComponent.java

package com.nsoft.gkzp.syscore.config;

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;
import org.springframework.context.annotation.PropertySource;


/**
 * 監聽http端口,使http訪問端口生效
 */
@Configuration
@PropertySource(value="classpath:application.properties")
public class httpComponent {

    //讀取application.properties配置文件配置的http監控端口
    @Value("${server.http.port}")
    public  int SYSTEM_HTTP_PORT;

    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加http
        return tomcat;
    }

    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setPort(SYSTEM_HTTP_PORT);
        return connector;
    }

}

至此,就可以用  https://localhost   和 http://localhost:8082 訪問了。這是spring2.x的配法。

 

 

 

注意: 上面在application.properties配置文件中配置訪問端口號,是因為工程用了內置的tomcat容器(如下圖pom.xml引入的tomcat依賴)。如果是用外部的tomcat,則直接在tomcat的\conf\server.xml配置文件里配置相關參數。

 

 

 

 


參考文章:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM