spring boot项目同时开启http和https支持

痞子三分冷 提交于 2020-03-02 11:19:17

背景介绍

前端语音转写服务因浏览器安全限制问题需要使用https,后端需要同步配置ssl进行https升级,因存在一些周边历史微服务调用了本系统的部分http接口,希望同时保留原http支持。

spring boot版本:2.0.8

内嵌服务器使用undertow (Undertow是新一代轻量级高性能容器。 Undertow 提供阻塞或基于 XNIO 的非阻塞机制,它的包大小不足 1MB,内嵌模式运行时的堆内存占用只有 4MB 左右, 在基于天花板接口的测试中,综合对比tomcat、jetty、undertow,undertow相对性能更高)

一、生成证书,可以使用自签名或者从SSL证书授权中心获取。

本人使用 JDK中证书管理工具keytool来生成自签名证书。 

C:\Users\Administrator>keytool -genkey -alias undertow -keyalg RSA -keystore E:\https\ssl.keystore

2、SpringBoot配置SSL

将ssl.keystore拷贝到项目resource目录下,然后修改配置文件

# Undertow服务器支持HTTPS服务
server:
  port: 8443
  ssl:
    key-store: classpath:ssl.keystore
    key-store-password: 123456
    key-store-type: JKS
    keyAlias: undertow
  # 启用http2提速
  http2:
    enabled: true

# 同时指定http端口,共同支持
custom:
  server:
    http:
      port: 8080

3、undertow开启同时监听http及https

新增UndertowHttpsConfig配置类,开启http及https端口监听

package com.iflytek.cog.aimind.config;


import io.undertow.UndertowOptions;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import io.undertow.Undertow;
import io.undertow.servlet.api.SecurityConstraint;
import io.undertow.servlet.api.SecurityInfo;
import io.undertow.servlet.api.TransportGuaranteeType;
import io.undertow.servlet.api.WebResourceCollection;

/**
 *
 * @description 采用Undertow作为服务器,支持Https服务配置
 */
@Configuration
public class UndertowHttpsConfig {
    /**
     * http服务端口
     */
    @Value("${custom.server.http.port}")
    private Integer httpPort;

    /**
     * https服务端口
     */
    @Value("${server.port}")
    private Integer httpsPort;


    @Bean
    public ServletWebServerFactory undertowFactory() {
        UndertowServletWebServerFactory undertowFactory = new UndertowServletWebServerFactory();
        undertowFactory.addBuilderCustomizers((Undertow.Builder builder) -> {
            //同时监听http端口
            builder.addHttpListener(httpPort, "0.0.0.0");
            // 开启HTTP2
            builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);
        });

        // 开启HTTP自动跳转至HTTPS
        // 此配置注释可同时支持http及https调用
      /*  undertowFactory.addDeploymentInfoCustomizers(deploymentInfo -> {
            deploymentInfo.addSecurityConstraint(new SecurityConstraint()
                .addWebResourceCollection(new WebResourceCollection().addUrlPattern("/*"))
                .setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
                .setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
                .setConfidentialPortManager(exchange -> httpsPort);
        });*/
        return undertowFactory;
    }
}

至此springboot2升级https配置结束,不配置http调整https可同时支持两种方式调用。

启动项目访问 https://ip:8443/swagger-ui.html, http://ip:8080/swagger-ui.html均可进行调试。

参考资料

Springboot配置使用ssl,使用https

Spring Boot 容器选择 Undertow 而不是 Tomcat

后续之《SpringBoot服务器压测对比(jetty、tomcat、undertow)》

Spring Boot-实现Undertow服务器同时支持HTTP2、HTTPS

HTTP1.1 与 HTTP2.0 知多少?

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!