完整代码地址在结尾!!
第一步,获取ssl证书,有两种方式
- 自己通过jdk的keytool命令生成
- 通过证书授权机构购买
本文采用第二种,在阿里云购买了免费的证书,需要提交资料,等待审核通过即可。
第二步,购买后在阿里云控制台下载证书,类型选为Tomcat的即可
下载后在证书目录下执行阿里云提供的命令,密码都填pfx-password.txt中的内容(需要三次),会生成javalsj.jks文件
keytool -importkeystore -srckeystore xxx.pfx -destkeystore javalsj.jks -srcstoretype PKCS12 -deststoretype JKS
第三步,创建工程,并将上面生成的javalsj.jks文件移动到resources目录下
第四步,在pom.xml加入依赖,如下
<!-- 排除 Tomcat 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 排除 Tomcat 依赖 -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Undertow -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!-- Undertow 相关依赖 -->
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-servlet</artifactId>
<version>2.1.4.Final</version>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-core</artifactId>
<version>2.1.4.Final</version>
</dependency>
<dependency>
<groupId>io.undertow</groupId>
<artifactId>undertow-websockets-jsr</artifactId>
<version>2.1.4.Final</version>
</dependency>
第五步,在application.yml配置文件配置kafka
# http服务端口
custom:
server:
http:
port: 8087
spring:
application:
name: https-demo-server
# 开启https支持
server:
http2:
enabled: true
port: 8443 # https服务端口
servlet:
context-path: /api # 接口统一前缀
ssl: # 指定ssl证书
key-store: classpath:javalsj.jks
key-store-password: tuc0KI70
undertow: # 配置 undertow 服务器
buffer-size: 512
io-threads: 2
worker-threads: 20
第六步,创建WebServerConfig类,如下
import io.undertow.Undertow;
import io.undertow.UndertowOptions;
import io.undertow.servlet.api.SecurityConstraint;
import io.undertow.servlet.api.SecurityInfo;
import io.undertow.servlet.api.TransportGuaranteeType;
import io.undertow.servlet.api.WebResourceCollection;
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;
/**
* @Description: 采用Undertow作为服务器,支持Https服务配置
* @Author: luoyu
* @Date: 2020/7/16 10:39 下午
* @Version: 1.0.0
*/
@Configuration
public class WebServerConfig {
/**
* http服务端口
*/
@Value("${custom.server.http.port}")
private Integer httpPort;
/**
* https服务端口
*/
@Value("${server.port}")
private Integer httpsPort;
/**
* @author jinhaoxun
* @description 采用Undertow作为服务器。
* Undertow是一个用java编写的、灵活的、高性能的Web服务器,提供基于NIO的阻塞和非阻塞API,特点:
* 非常轻量级,Undertow核心瓶子在1Mb以下。它在运行时也是轻量级的,有一个简单的嵌入式服务器使用少于4Mb的堆空间。
* 支持HTTP升级,允许多个协议通过HTTP端口进行多路复用。
* 提供对Web套接字的全面支持,包括JSR-356支持。
* 提供对Servlet 3.1的支持,包括对嵌入式servlet的支持。还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序。
* 可以嵌入在应用程序中或独立运行,只需几行代码。
* 通过将处理程序链接在一起来配置Undertow服务器。它可以对各种功能进行配置,方便灵活。
* @return ServletWebServerFactory
*/
@Bean
public ServletWebServerFactory undertowFactory() {
UndertowServletWebServerFactory undertowFactory = new UndertowServletWebServerFactory();
undertowFactory.addBuilderCustomizers((Undertow.Builder builder) -> {
builder.addHttpListener(httpPort, "0.0.0.0");
// 开启 HTTP2
builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true);
});
undertowFactory.addDeploymentInfoCustomizers(deploymentInfo -> {
// 开启 HTTP 自动跳转至 HTTPS
deploymentInfo.addSecurityConstraint(new SecurityConstraint()
.addWebResourceCollection(new WebResourceCollection().addUrlPattern("/*"))
.setTransportGuaranteeType(TransportGuaranteeType.CONFIDENTIAL)
.setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT))
.setConfidentialPortManager(exchange -> httpsPort);
});
return undertowFactory;
}
}
第七步,创建TestController类,如下
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Description:
* @Author: luoyu
* @Date: 2020/7/16 10:39 下午
* @Version: 1.0.0
*/
@RestController
@RequestMapping("/test")
public class TestController {
/**
* @author luoyu
* @description 测试接口
*/
@GetMapping(value = "/get", produces = "application/json; charset=UTF-8")
public String getTest() throws Exception {
return "Hello";
}
}