diff --git a/pom.xml b/pom.xml
index 8311573..d8ca386 100644
--- a/pom.xml
+++ b/pom.xml
@@ -67,6 +67,7 @@
spring-boot-demo-ratelimit-guava
spring-boot-demo-ratelimit-redis
spring-boot-demo-elasticsearch-rest-high-level-client
+ spring-boot-demo-https
pom
diff --git a/spring-boot-demo-https/.gitignore b/spring-boot-demo-https/.gitignore
new file mode 100644
index 0000000..a2a3040
--- /dev/null
+++ b/spring-boot-demo-https/.gitignore
@@ -0,0 +1,31 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**
+!**/src/test/**
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+
+### VS Code ###
+.vscode/
diff --git a/spring-boot-demo-https/.mvn/wrapper/MavenWrapperDownloader.java b/spring-boot-demo-https/.mvn/wrapper/MavenWrapperDownloader.java
new file mode 100644
index 0000000..f6e782c
--- /dev/null
+++ b/spring-boot-demo-https/.mvn/wrapper/MavenWrapperDownloader.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+ private static final String WRAPPER_VERSION = "0.5.6";
+ /**
+ * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+ */
+ private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+ /**
+ * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+ * use instead of the default one.
+ */
+ private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+ ".mvn/wrapper/maven-wrapper.properties";
+
+ /**
+ * Path where the maven-wrapper.jar will be saved to.
+ */
+ private static final String MAVEN_WRAPPER_JAR_PATH =
+ ".mvn/wrapper/maven-wrapper.jar";
+
+ /**
+ * Name of the property which should be used to override the default download url for the wrapper.
+ */
+ private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+ public static void main(String args[]) {
+ System.out.println("- Downloader started");
+ File baseDirectory = new File(args[0]);
+ System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+ // If the maven-wrapper.properties exists, read it and check if it contains a custom
+ // wrapperUrl parameter.
+ File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+ String url = DEFAULT_DOWNLOAD_URL;
+ if (mavenWrapperPropertyFile.exists()) {
+ FileInputStream mavenWrapperPropertyFileInputStream = null;
+ try {
+ mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+ Properties mavenWrapperProperties = new Properties();
+ mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+ url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+ } catch (IOException e) {
+ System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+ } finally {
+ try {
+ if (mavenWrapperPropertyFileInputStream != null) {
+ mavenWrapperPropertyFileInputStream.close();
+ }
+ } catch (IOException e) {
+ // Ignore ...
+ }
+ }
+ }
+ System.out.println("- Downloading from: " + url);
+
+ File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+ if (!outputFile.getParentFile().exists()) {
+ if (!outputFile.getParentFile().mkdirs()) {
+ System.out.println(
+ "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+ }
+ }
+ System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+ try {
+ downloadFileFromURL(url, outputFile);
+ System.out.println("Done");
+ System.exit(0);
+ } catch (Throwable e) {
+ System.out.println("- Error downloading");
+ e.printStackTrace();
+ System.exit(1);
+ }
+ }
+
+ private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+ if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+ String username = System.getenv("MVNW_USERNAME");
+ char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+ Authenticator.setDefault(new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(username, password);
+ }
+ });
+ }
+ URL website = new URL(urlString);
+ ReadableByteChannel rbc;
+ rbc = Channels.newChannel(website.openStream());
+ FileOutputStream fos = new FileOutputStream(destination);
+ fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+ fos.close();
+ rbc.close();
+ }
+
+}
diff --git a/spring-boot-demo-https/.mvn/wrapper/maven-wrapper.jar b/spring-boot-demo-https/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..2cc7d4a
Binary files /dev/null and b/spring-boot-demo-https/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/spring-boot-demo-https/.mvn/wrapper/maven-wrapper.properties b/spring-boot-demo-https/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..642d572
--- /dev/null
+++ b/spring-boot-demo-https/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
diff --git a/spring-boot-demo-https/README.md b/spring-boot-demo-https/README.md
new file mode 100644
index 0000000..aab869f
--- /dev/null
+++ b/spring-boot-demo-https/README.md
@@ -0,0 +1,68 @@
+# Getting Started
+
+### Reference Documentation
+For further reference, please consider the following sections:
+
+* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
+* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/maven-plugin/)
+
+
+
+1. 首先使用jdk 自带的keytool 命令生成证书(一般在用户目录下C:\Users\Administrator\server.keystore) 复制到项目中
+> 自己生成的证书浏览器会有危险提示,去ssl网站上使用金钱申请则不会
+
+![ssl 命令截图](ssl.png)
+
+
+2. 然后添加配置
+```yml
+server:
+ ssl:
+ # 证书路径
+ key-store: spring-boot-demo-https\src\main\resources\server.keystore
+ key-alias: tomcat
+ enabled: true
+ key-store-type: JKS
+ #与申请时输入一致
+ key-store-password: 123456
+ # 浏览器默认端口 和 80 类似
+ port: 443
+#debug: true
+
+
+```
+
+3. 需要与http 自动跳转再添加bean
+
+```java
+
+ @Bean
+ public Connector connector(){
+ Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
+ connector.setScheme("http");
+ connector.setPort(80);
+ connector.setSecure(false);
+ connector.setRedirectPort(443);
+ return connector;
+ }
+
+ @Bean
+ public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
+ 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;
+ }
+
+```
+
+
diff --git a/spring-boot-demo-https/pom.xml b/spring-boot-demo-https/pom.xml
new file mode 100644
index 0000000..d90ec5e
--- /dev/null
+++ b/spring-boot-demo-https/pom.xml
@@ -0,0 +1,56 @@
+
+
+ 4.0.0
+
+ com.xkcoding
+ spring-boot-demo-https
+ 0.0.1-SNAPSHOT
+ spring-boot-demo-https
+ Demo project for Spring Boot
+
+
+
+ com.xkcoding
+ spring-boot-demo
+ 1.0.0-SNAPSHOT
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.junit.vintage
+ junit-vintage-engine
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/spring-boot-demo-https/src/main/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplication.java b/spring-boot-demo-https/src/main/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplication.java
new file mode 100644
index 0000000..be323c3
--- /dev/null
+++ b/spring-boot-demo-https/src/main/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplication.java
@@ -0,0 +1,62 @@
+package com.xkcoding.springbootdemohttps;
+
+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.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
+import org.springframework.context.annotation.Bean;
+
+
+/**
+ *
+ * SpringBoot启动类
+ *
+ *
+ * @package: com.xkcoding.https
+ * @description: SpringBoot启动类
+ * @author: Chen.Chao
+ * @date 2020.01.12 10:31 am
+ * @copyright: Copyright (c)
+ * @version: V1.0
+ * @modified: Chen.Chao
+ */
+@SpringBootApplication
+public class SpringBootDemoHttpsApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootDemoHttpsApplication.class, args);
+ }
+
+
+ @Bean
+ public Connector connector(){
+ Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
+ connector.setScheme("http");
+ connector.setPort(80);
+ connector.setSecure(false);
+ connector.setRedirectPort(443);
+ return connector;
+ }
+
+ @Bean
+ public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
+ 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;
+ }
+
+
+}
diff --git a/spring-boot-demo-https/src/main/resources/application.yml b/spring-boot-demo-https/src/main/resources/application.yml
new file mode 100644
index 0000000..d6d2def
--- /dev/null
+++ b/spring-boot-demo-https/src/main/resources/application.yml
@@ -0,0 +1,12 @@
+server:
+ ssl:
+ # 证书路径
+ key-store: spring-boot-demo-https\src\main\resources\server.keystore
+ key-alias: tomcat
+ enabled: true
+ key-store-type: JKS
+ #与申请时输入一致
+ key-store-password: 123456
+ # 浏览器默认端口 和 80 类似
+ port: 443
+#debug: true
diff --git a/spring-boot-demo-https/src/main/resources/server.keystore b/spring-boot-demo-https/src/main/resources/server.keystore
new file mode 100644
index 0000000..a6b59ff
Binary files /dev/null and b/spring-boot-demo-https/src/main/resources/server.keystore differ
diff --git a/spring-boot-demo-https/src/main/resources/static/index.html b/spring-boot-demo-https/src/main/resources/static/index.html
new file mode 100644
index 0000000..067bc53
--- /dev/null
+++ b/spring-boot-demo-https/src/main/resources/static/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+ spring boot demo https
+
+
+
+ spring boot demo https
+
+
+
+
diff --git a/spring-boot-demo-https/src/test/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplicationTests.java b/spring-boot-demo-https/src/test/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplicationTests.java
new file mode 100644
index 0000000..ce62f83
--- /dev/null
+++ b/spring-boot-demo-https/src/test/java/com/xkcoding/springbootdemohttps/SpringBootDemoHttpsApplicationTests.java
@@ -0,0 +1,13 @@
+package com.xkcoding.springbootdemohttps;
+
+import org.junit.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class SpringBootDemoHttpsApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+}
diff --git a/spring-boot-demo-https/ssl.png b/spring-boot-demo-https/ssl.png
new file mode 100644
index 0000000..6961426
Binary files /dev/null and b/spring-boot-demo-https/ssl.png differ