方式一、Tomcat配置

 一、相关配置

application.yml配置

server:
  #HTTPS和HTTP共用端口号
  port: 8443
  #如果要使用HTTP就注释掉一下配置信息测试的端口号就是定义的8080端口
  #SSL配置 
  ssl:
    #证书配置
    key-store: E://server.p12
    #密码配置
    key-store-password: 123456
    key-password: 123456
可以看到,只是简简单单添加端口的信息,server.p12可以自己生成(记得对应密码),也可以在官网例子里面下载。

下载链接

 二、spring boot启动文件读取配置信息(注:请添加必要的jar)

@SpringBootApplication
public class SpringBootHttpsApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(SpringBootHttpsApplication.class, args);
    }

    @Value("${server.port}")
	private Integer port;

	@Value("${server.ssl.key-store-password}")
	private String key_store_password;

	@Value("${server.ssl.key-password}")
	private String key_password;
  
  /* --------------------请按照自己spring boot版本选择 start--------------------- */
  // 这是spring boot 1.5.X以下版本的 添加了这个,下一个就不用添加了
    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        tomcat.addAdditionalTomcatConnectors(createSslConnector()); // 添加http
        return tomcat;
    }
  
  // 这是spring boot 2.0.X版本的 添加这个,上一个就不用添加了
  @Bean
  public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    tomcat.addAdditionalTomcatConnectors(createSslConnector()); // 添加http
    return tomcat;
  }
  /* -------------------请按照自己spring boot版本选择 end---------------------- */
 
 
  // 配置https
    private Connector createSslConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
        try {
            File keystore = new ClassPathResource("server.p12").getFile();/
            connector.setScheme("http");
			// Connector监听的http的端口号
			connector.setPort(8080);
			connector.setSecure(false);
			// 监听到http的端口号后转向到的https的端口号
			connector.setRedirectPort(port);
			// 开启SSL配置
			protocol.setSSLEnabled(true);
			protocol.setKeystoreFile(keystore.getAbsolutePath());
			protocol.setKeystorePass(key_store_password);
			protocol.setKeyPass(key_password);
            return connector;
        }
        catch (IOException ex) {
            throw new IllegalStateException("can't access keystore: [" + "keystore"
                    + "] or truststore: [" + "keystore" + "]", ex);
        }
    }
}

 

启动项目后,可以看到两个端口,说明已经成功

springboot调用EJB Springboot调用https和http_端口号

方式二、UnderTow配置

  一、相关配置

<dependency>
	<!--解除对tomcat的依赖 -->
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<!--undertow包的依赖 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>

 

  二、其次修改properties配置文件,修改一下有关tomcat的配置,我这里主要有关的就是日志文件的配置,当然了没有的话就不用配置了

# 存放Tomcat的日志、Dump等文件的临时文件夹,默认为系统的tmp文件夹
#server.tomcat.basedir=./
#打开Tomcat的Access日志
#server.tomcat.accesslog.enabled=true
#Access日志存放的路劲
#server.tomcat.accesslog.directory=logs/access_log
#server.tomcat.accesslog.buffered=false
#server.tomcat.accesslog.request-attributes-enabled=true
#Access日志的输出格式
#server.tomcat.accesslog.pattern=%t [%I] %{X-Forwarded-For}i %a %r %s %D
#以上是tomcat的日志配置全都注释掉,下面是有关undertow的配置
server.undertow.accesslog.enabled=true
server.undertow.accesslog.dir=logs/access_log
server.undertow.accesslog.pattern= %t [%I] %a %r %s (%b Byte) (%T ms)

重启服务可以看到你的服务已经是undertow了

说明:undertow替换tomcat就是这么简单

springboot+http到https
1、http转https需要安全协议ssl证书,协议证书基本上都需要花钱买的,也有免费试用期限的,不过可以自己生成ssl证书(又为自签证书),自己生成证书的方法有多种,在这里就简单的介绍一种由jdk自带的keytool工具生成自签证书,生成证书的前提条件是已经安装了jdk,其次找到安装jdk的bin目录下,可以看到有个keytool

2、使用keytool命令生成证书
keytool
-genkey
-alias undertow(别名)
-keypass 123456(别名密码)
-storetype PKCS12(密钥类型)
-keyalg RSA(算法)
-keysize 1024(密钥长度)
-validity 365(有效期,天单位)
-keystore D:/keys/ldkeystore.p12(指定生成证书的位置和证书名称)
-storepass 123456(获取keystore信息的密码)
方便复制版:
keytool -genkey -alias undertow -storetype PKCS12 -keyalg RSA  -keypass 123456 -keysize 1024 -validity 365 -keystore D:\keys\ldkeystore.p12 -storepass 123456
如图:

3、上图选择y即可在D:/keys/文件夹内生成名为ldkeystore.p12的自签证书。
成功后无提示信息
注意:
①D:/keys/目录需要提前手动创建好,否则会生成失败
②提示输入域名的时候不能输入IP地址
问题①的错误信息如下:

4、springboot配置自签证书
在application.properties中配置自签证书
server.ssl.key-store=D:/keys/ldkeystore.p12   #证书
server.ssl.key-store-password=123456           #别名密码
server.ssl.key-store-type=PKCS12             #证书类型
server.ssl.key-alias=tomcat   #别名

5、重启服务,通过https://...访问链接即可

注意:在第一次浏览时会提示,此网址存在安全问题,不要紧继续浏览此网页即可,这样就从http转换到https,有不懂http、https的小伙伴也可以先了解一下http和https之间的区别
 

三、springboot+undertow+https+http2
1、前三项已经实现了,那么undertow如何支持http2,这就需要再在代码里编写了,首先需要找到配置类(带有@Configuration JAVA类即可),这里假设你的服务端口为8443
代码如下:
 

/**
	 * undertow服务器下http重定向到https
	 */
	@Bean
	UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {
		UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();
		// 这段就可以可以转换为http2
		factory.addBuilderCustomizers(builder -> builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true));
		// 这段可以增加http重定向,如果只需要http2的话下面的代码可以去掉
		factory.addBuilderCustomizers(new UndertowBuilderCustomizer() {
			@Override
			public void customize(Undertow.Builder builder) {
				builder.addHttpListener(8080, "0.0.0.0");
			}
		});
		// 下面这段是将http的8080端口重定向到https的8443端口上
		factory.addDeploymentInfoCustomizers(deploymentInfo -> {
			deploymentInfo
					.addSecurityConstraint(new SecurityConstraint()
							.addWebResourceCollection(new WebResourceCollection().addUrlPattern("/*"))
							.setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
							.setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
					.setConfidentialPortManager(exchange -> 8443);
		});
		return factory;
	}

2、重启服务,https://localhost:8443可以访问网页,也可以通过http://localhost:8080访问会自动跳转到https://localhost:8443的端口上 ;
3、验证http2:使用Chrome的网络工具,在地址栏中输入chrome://net-internals/#http2

希望以上两种方式可以帮到您。