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文件
·
- 4.啟動服務即可訪問 https://localhost:8443。
看application.properties配置文件可知,后面只能用https協議訪問了。
1) http訪問自動轉https
(用戶前期用http協議,突然改成只用https訪問,這樣有的客戶還用http訪問時就訪問不到服務器了,針對這種情況可做http訪問自動轉到https)
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配置文件里配置相關參數。

參考文章: