在项目中遇到既要支持http协议请求和https协议请求的场景,结合场景有两种解决方案:
第一种:编程实现,第二种:反向代理。
首先我们要清楚http和https的区别,百度过来一点
HTTP(HTTP,HyperText Transfer Protocol)超文本传输协议
HTTP:是互联网上应用最为广泛的一种网络协议。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。它可以使浏览器更加高效。HTTP 协议是以明文方式发送信息的,如果黑客截取了 Web 浏览器和服务器之间的传输报文,就可以直接获得其中的信息。
① 客户端的浏览器首先要通过网络与服务器建立连接,该连接是通过 TCP 来完成的,一般 TCP 连接的端口号是80。 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URI)、协议版本号,后边是 MIME 信息包括请求修饰符、客户机信息和许可内容。
② 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。
HTTPS(Hypertext Transfer Protocol Secure)超文本传输安全协议
是以安全为目标的 HTTP 通道,是 HTTP 的安全版。HTTPS 的安全基础是 SSL。SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL 协议可分为两层:SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议(SSL Handshake Protocol),它建立在 SSL 记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
简单来讲就是多了一个SSL协议。
1、生成安全证书网上有教程,我是生成的jks
keytool -genkeypair -alias myssl -keyalg RSA -keypass mypass -keystore myssl.jks -storepass mypass -keystore C:\Users\siqm\myssl.jks
然后将生成的证书,myssl.jks放入到gateway的resource目录下
然后myl配置启用ssl
server:
port: 8080
ssl:
#开启https
enabled: true
#指定存放证书的密钥库文件的位置
key-store: classpath:star.jks
#密钥库文件的格式
key-store-type: JKS
#别名,需要与创建密钥库时的别名一致
key-alias: myssl
key-password: mypass
key-store-password: mypass
注意其中的别名一致。
这样你请求可以验证https了,
下面还要支持http.
package cn.hx.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory;
import org.springframework.boot.web.server.WebServer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.server.reactive.HttpHandler;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
/**
* Des: 支持http配置
* Author: SiQiangMing 2023/4/21 11:28
*/
@Configuration
public class HttpConfig {
@Value("${server.custom.httpPort:8088}")
private Integer httpPort;
@Autowired
private HttpHandler httpHandler;
private WebServer webServer;
@PostConstruct
public void start(){
NettyReactiveWebServerFactory factory = new NettyReactiveWebServerFactory(httpPort);
webServer = factory.getWebServer(httpHandler);
webServer.start();
}
@PreDestroy
public void stop(){
webServer.stop();
}
}
然后验证
http
https