Spring Boot实现Undertow服务器支持HTTP2协议

2024-01-27 17:48

本文主要是介绍Spring Boot实现Undertow服务器支持HTTP2协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

如今,企业级应用程序的高性能安全加密的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程序同时支持HTTP和HTTPS两种协议。Spring Boot的web容器已经有容器可以支持HTTP2了,这个例子中选择了Undertow高性能服务器作为Spring Boot的web容器。

What-什么是HTTP2

HTTP2是HTTP协议自1999年HTTP1.1发布后的首个更新,主要基于SPDY协议。由互联网工程任务组(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工作小组进行开发。该组织于2014年12月将HTTP/2标准提议递交至IESG进行讨论,于2015年2月17日被批准。HTTP2标准于2015年5月以RFC7540正式发表。

Why-为什么要用HTTP2

HTTP2是第二代的HTTP协议,关于HTTP2的优点这里就不阐述了,可以参考下面链接文章了解:http://ju.outofmemory.cn/entr…。

下图是Akamai 公司建立的一个官方的演示,主要用来说明在性能上HTTP/1.1和HTTP/2在性能升的差别。同时请求 379 张图片,HTTP/1.1加载用时4.54s,HTTP/2加载用时1.47s,大家可以通过 https://http2.akamai.com/demo 来感受下HTTP2的提速。

What-什么是HTTPS

要说HTTPS我们得先说SSL(Secure Sockets Layer,安全套接层),这是一种为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密。SSL协议可以分为两层:SSL记录协议(SSL Record Protocol),它建立在可靠的传输协议如TCP之上,为高层协议提供数据封装、压缩、加密等基本功能支持;SSL握手协议(SSL Handshake Protocol),它建立在SSL记录协议之上,用于在实际数据传输开始之前,通信双方进行身份认证、协商加密算法、交换加密密钥等。在Web开发中,我们是通过HTTPS来实现SSL的。HTTPS是以安全为目标的HTTP通道,简单来说就是HTTP的安全版,即在HTTP下加入SSL层,所以说HTTPS的安全基础是SSL,不过这里有一个地方需要小伙伴们注意,就是我们现在市场上使用的都是TLS协议(Transport Layer Security,它来源于SSL),而不是SSL,由于SSL出现较早并且被各大浏览器支持因此成为了HTTPS的代名词。

Why-为什么要用HTTPS

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS和HTTP的区别主要为以下四点:

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。

二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

How-如何使用HTTPS和HTTP

如果你使用Spring Boot,并且想在内嵌服务器中添加HTTPS,需要如下步骤:

  1. 要有一个SSL证书,买的或者自己生成的。
  2. Spring Boot中启动HTTPS。
  3. 将HTTP重定向到HTTPS(可选)。

一.通过云平台获取SSL证书

证书获取有两种方式,一种是自己通过jdk的keytool命令生成,一种是通过证书授权机构购买,本文为了方便采用第二种从阿里云购买证书。

去阿里云购买证书(免费版),并提交审核资料

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下载SSL证书
在这里插入图片描述
在这里插入图片描述

在证书目录下执行阿里云提供的命令,密码都填 pfx-password.txt 中的内容(三次),会生成 javalsj.jks 文件。

复制代码 代码如下:

keytool -importkeystore -srckeystore 214533136960974.pfx -destkeystore javalsj.jks -srcstoretype PKCS12 -deststoretype JKS

二.通过jdk自带的keytool工具进行生成

生成证书(在要生成证书的目录下,按着 Shit 建同时鼠标右键出现[在此处打开命令窗口])
在这里插入图片描述

复制代码 代码如下:

keytool -genkey -alias test -keyalg RSA -keysize 1024 -keystore charleslai -validity 365

利用"keytool -list -v -keystore charleslai.jks"查看JKS中生成的证书的详细信息

利用“keytool -alias test -exportcert -keystore test.jks -file charleslai.cer”,导出证书,并可以双击打开证书查看证书信息

在Spring Boot中启动HTTPS和HTTP2

将charleslai.jks复制到Spring Boot应用的resources目录下

在application.properties中配置证书及端口,密码填写第3步中的密码

##################################---Undertow服务器支持HTTPS服务---############################################## server.http2.enabled=true server.servlet.context-path=/blog custom.server.http.port=8080 server.port=8443 server.ssl.key-store=classpath:javalsj.jks server.ssl.key-store-password=214533136960974 server.undertow.worker-threads=20 server.undertow.buffer-size=512 server.undertow.io-threads=2

此配置会使Undertow容器监听8443端口,那么只有在域名前添加 https://才能访问网站内容,添加http://则不行,所以需要让Undertow容器监听8080端口,并将8080端口的所有请求重定向到8443端口,即完成http到https的跳转。

将HTTP重定向到HTTPS(可选)

工程使用Gradle集成轻量级高性能非阻塞服务器undertow所需要的jar包:

compile group: ‘org.springframework.boot’, name: ‘spring-boot-starter-undertow’

然后编写代码如下:

package com.javalsj.blog.configuration; 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服务配置 * @author WANGJIHONG * @date 2018年3月7日 下午8:34:18 * @Copyright 版权所有 (c) www.javalsj.com * @memo 备注信息 */@Configurationpublic class WebServerConfiguration { /** * http服务端口 */@Value("${custom.server.http.port}") private Integer httpPort; /** * https服务端口 */@Value("${server.port}") private Integer httpsPort; /** * 采用Undertow作为服务器。 * Undertow是一个用java编写的、灵活的、高性能的Web服务器,提供基于NIO的阻塞和非阻塞API,特点: * 非常轻量级,Undertow核心瓶子在1Mb以下。它在运行时也是轻量级的,有一个简单的嵌入式服务器使用少于4Mb的堆空间。 * 支持HTTP升级,允许多个协议通过HTTP端口进行多路复用。 * 提供对Web套接字的全面支持,包括JSR-356支持。 * 提供对Servlet 3.1的支持,包括对嵌入式servlet的支持。还可以在同一部署中混合Servlet和本机Undertow非阻塞处理程序。 * 可以嵌入在应用程序中或独立运行,只需几行代码。 * 通过将处理程序链接在一起来配置Undertow服务器。它可以对各种功能进行配置,方便灵活。 */@Beanpublic 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; } }

验证HTTPS和HTTP2开启成功

重启服务,即完成了HTTP到HTTPS的升级,且能自动跳转HTTPS,让网站更安全。输入http://localhost:8080/blog/swagger-ui.html后回车地址栏自动跳转至https://localhost:8443/blog/swagger-ui.html,如图:

在这里插入图片描述

使用Chrome浏览器的console控制台,输入脚本后回车查看HTTP2是否开启,脚本如下:

(function(){ // 保证这个方法只在支持loadTimes的chrome浏览器下执行 if(window.chrome && typeof chrome.loadTimes === 'function') { var loadTimes = window.chrome.loadTimes(); var spdy = loadTimes.wasFetchedViaSpdy; var info = loadTimes.npnNegotiatedProtocol || loadTimes.connectionInfo; // 就以 「h2」作为判断标识 if(spdy && /^h2/i.test(info)) { return console.info('本站点使用了HTTP/2'); } } console.warn('本站点没有使用HTTP/2'); })();

keytool的详细用法: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html
常见的证书格式及其说明参考:http://www.cnblogs.com/xq1314/archive/2017/12/05/7987216.html
————————————————
版权声明:本文为CSDN博主「大扑棱蛾子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jaune161/article/details/82879044
总结

本文只是介绍了Undertow服务器的HTTPS支持,Spring Boot支持Jetty,Tomcat等服务器,不同的服务器实现可以查资料了解,嘿嘿

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

这篇关于Spring Boot实现Undertow服务器支持HTTP2协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/651029

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三