SpringBoot——实现Undertow服务器同时支持HTTP2和HTTPSHTTP和HTTPS协议都支持。SpringBoot的web容器已经有了可以支持HTTP2的容器。本例中选择Undertow高性能服务器作为SpringBootWeb容器。What-WhatisHTTP2HTTP2是HTTP协议自1999年发布HTTP1.1以来的第一次更新,主要基于SPDY协议。由互联网工程任务组(IETF)的超文本传输??协议双(httpbis)工作组开发。该组织于2014年12月向IESG提交HTTP/2标准提案进行讨论,并于2015年2月17日获批。HTTP2标准于2015年5月正式发布为RFC7540。Why-WhyuseHTTP2HTTP2是第二代HTTP协议。HTTP2的优点这里就不细说了。可以参考以下链接文章:http://ju.outofmemory.cn/entr....下图是Akamai官方制作的演示,主要用来说明HTTP/1.1和HTTP/1.1在性能上的区别2在性能方面。同时请求379张图片,HTTP/1.1加载时间为4.54s,HTTP/2加载时间为1.47s。您可以通过https://http2.akamai.com/demo体验HTTP2的提速。What——什么是HTTPS要说HTTPS,首先得说说SSL(SecureSocketsLayer,安全套接字层),它是一种为网络通信提供安全性和数据完整性的安全协议。SSL支持网络传输层的网络连接。加密。SSL协议可分为两层:SSL记录协议(SSLRecordProtocol),它建立在TCP等可靠的传输协议之上,为数据封装、压缩、加密等高层协议提供基础功能支持;SSL握手协议(SSLHandshakeProtocol)协议)建立在SSL记录协议之上,用于在实际数据传输开始之前进行身份认证、加密算法的协商、加密密钥的交换等。在Web开发中,我们通过HTTPS实现SSL。HTTPS是以安全为目标的HTTP通道。简单的说就是安全版的HTTP,即在HTTP的基础上增加了SSL层。所以,HTTPS的安全基础是SSL,但是有一个地方需要小伙伴们注意,那就是我们市场上使用的是TLS协议(TransportLayerSecurity,由SSL衍生而来),而不是SSL。由于SSL出现较早,并得到各大浏览器的支持,所以它已经成为HTTPS的代名词。Why-WhyuseHTTPSHypertextTransferProtocolHTTP协议用于在网络浏览器和网络服务器之间传递信息。HTTP协议以明文形式发送内容,不提供任何形式的数据加密。如果攻击者截获了网页浏览器与网站服务器之间的传输报文,就可以直接读取其中的信息。因此,HTTP协议不适合传输一些敏感信息,如信用卡号、密码等。为了解决HTTP协议的这一缺陷,需要使用另一种协议:SecureSocketsLayerHypertextTransferProtocolHTTPS.为了数据传输的安全,HTTPS在HTTP的基础上增加了SSL协议。SSL依靠证书来验证服务器的身份并对浏览器和服务器之间的通信进行加密。HTTPS与HTTP的区别主要有以下四点:1、HTTPS协议需要向CA申请证书。一般免费证书很少,需要收费。2、http是超文本传输??协议,信息以明文传输,https是安全的ssl加密传输协议。3、http和https使用完全不同的连接方式,使用的端口也不一样。前者是80,后者是443。4、http连接很简单,无状态;HTTPS协议是由SSL+HTTP协议构建的可以进行加密传输和身份认证的网络协议,比http协议更安全。How-HowtouseHTTPSandHTTP如果你使用SpringBoot,想在嵌入式服务器中加入HTTPS,需要以下步骤:必须有SSL证书,自己购买或生成。在SpringBoot中启用HTTPS。将HTTP重定向到HTTPS(可选)。1、通过云平台获取SSL证书。有两种方法可以获取证书。一种是通过jdk的keytool命令自己生成,一种是通过证书颁发机构购买。为了方便,本文采用第二种方式购买阿里云证书。到阿里云购买证书(免费版),提交审核材料下载SSL证书。在证书目录下执行阿里云提供的命令,在pfx-password.txt中填写密码(三次),会生成一个javalsj.jks文件。keytool-importkeystore-srckeystore214533136960974.pfx-destkeystorejavalsj.jks-srcstoretypePKCS12-deststoretypeJKS2.使用jdk自带的keytool工具生成证书(在要生成证书的目录下,按Shit构建,鼠标右键出现[打开这里]命令窗口])keytool-genkey-aliastest-keyalgRSA-keysize1024-keystorecharleslai-validity365使用“keytool-list-v-keystorecharleslai.jks”查看JKS中生成的证书的详细信息使用“keytool-aliastest-exportcert-keystoretest.jks-filecharleslai.cer”,导出证书,双击打开证书查看证书信息在SpringBoot中启动HTTPS和HTTP2将charleslai.jks复制到资源目录下SpringBootapplication在application.properties中配置证书和端口,password填写步骤3中的密码####################################---Undertow服务器支持HTTPS服务---##############################################server.http2.enabled=trueserver.servlet.context-path=/blogcustom.server.http.port=8080server.port=8443server.ssl.key-store=classpath:javalsj.jksserver.ssl.key-store-password=214533136960974server.undertow.worker-threads=20server.undertow.buffer-size=512server.undertow.io-threads=2这个配置会让Undertow容器监听8443端口端口,那么只能在域名前加https://才能访问网站内容,不能加http://,所以需要让Undertow容器监听8080端口,重定向所有来自的请求8080端口转8443端口,即完成http跳转到httpsHTTP重定向到HTTPS(可选)项目使用Gradle集成轻量级高性能非阻塞服务器undertow所需的jar包:编译组:'org.springframework.boot',名称:'spring-boot-starter-undertow'然后编写如下代码:.server.ServletWebServerFactory;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importio.undertow.Undertow;importio.undertow.servlet.api.SecurityConstraint;importio.undertow.servlet.api.SecurityInfo;importio.undertow.servlet.api.TransportGuaranteeType;importio.undertow.servlet.api.WebResourceCollection;/***@description使用Undertow作为服务器,支持Https服务配置*@authorWANGJIHONG*@dateMarch7,20188:34pm:18*@Copyright版权所有(c)www.javalsj.com*@memo备注信息*/@ConfigurationpublicclassWebServerConfiguration{/***http服务端口*/@Value("${custom.server.http.port}")privateIntegerhttpPort;/***https服务端口*/@Value("${server.port}")privateIntegerhttpsPort;/***使用Undertow作为服务器*Undertow是一个灵活的、高性能的网络服务器,提供基于NIO的阻塞和非阻塞API,特点:*非常轻量级,Undertow核心瓶在1Mb以下。运行时也是轻量级的,一个简单的嵌入式服务器占用的堆空间不到4Mb。*支持HTTP升级,允许通过HTTP端口多路复用多个协议。*提供对Web套接字的全面支持,包括JSR-356支持。*提供对Servlet3.1的支持,包括对嵌入式servlet的支持。也可以混合Servlet和本机Undertow非blockinghandlersinthesamedeployment.*Canbeembeddedinaapplicationorstandalonerunwithjustafewlinescode.*通过将handlers链接在一起起来配置Undertow服务器。它可以配置各种功能,方便灵活。*/@BeanpublicServletWebServerFactoryundertowFactory(){UndertowServletWebServerFactoryundertowFactory=newUndertowServletWebServerFactory();undertowFactory.addBuilderCustomizers((Undertow.Builderbuilder)->{builder.addHttpListener(httpPort,"0.0.0.0");//开启HTTP2builder.setServerOption2,EnABLEtowOption2,UnABLEtowOptions);});undertowFactory.addDeploymentInfoCustomizers(deploymentInfo->{//打开HTTP自动跳转到HTTPSdeploymentInfo.addSecurityConstraint(newSecurityConstraint().addWebResourceCollection(newWebResourceCollection().addUrlPattern("/*")).setTransportGuaranteeType(TransportGuaranteeType.CONFID.setEmptyRoleSemantic(SecurityInfo.EmptyRoleSemantic.PERMIT)).setConfidentialPortManager(exchange->httpsPort);});returnundertowFactory;}}验证是否启用了HTTPS和HTTP2并成功重启服务,即HTTP到HTTPS升级完成,并且可以自动跳转HTTPS,让网站更安全。输入http://localhost:8080/blog/swagger-ui.html,在地址栏输入自动跳转到https://localhost:8443/blog/swagger-ui.html,如图:使用控制台在Chrome浏览器控制台,输入脚本回车,查看是否开启了HTTP2。脚本如下:(function(){//确保该方法只在支持loadTimes的chrome浏览器下执行if(window.chrome&&typeofchrome.loadTimes==='function'){varloadTimes=window.chrome.loadTimes();varspdy=loadTimes.wasFetchedViaSpdy;variinfo=loadTimes.npnNegotiatedProtocol||loadTimes.connectionInfo;//使用“h2”作为判断标记if(spdy&&/^h2/i.test(info)){returnconsole.info('ThissiteusesHTTP/2');}}console.warn('ThissitedoesnotuseHTTP/2');})();总结本文只介绍Undertow服务器HTTPS支持,SpringBoot支持Jetty等服务器,tomcat等不同服务器实现可以查资料,呵呵
