中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

發布時間:2021-08-06 11:39:19 來源:億速云 閱讀:227 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

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的提速。

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

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的代名詞。

Spring Boot如何實現Undertow服務器同時支持HTTP2、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,需要如下步驟:

要有一個SSL證書,買的或者自己生成的。

在Spring Boot中啟動HTTPS。

將HTTP重定向到HTTPS(可選)。

一.通過云平臺獲取SSL證書

證書獲取有兩種方式,一種是自己通過jdk的keytool命令生成,一種是通過證書授權機構購買,本文為了方便采用第二種從阿里云購買證書。

去阿里云購買證書(免費版),并提交審核資料

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

下載SSL證書

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

在證書目錄下執行阿里云提供的命令,密碼都填 pfx-password.txt 中的內容(三次),會生成 javalsj.jks 文件。

復制代碼 代碼如下:

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

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

二.通過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目錄下

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

在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

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

此配置會使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 備注信息 
 
*/ 
 
@Configuration 
 
public 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服務器。它可以對各種功能進行配置,方便靈活。 
 
*/ 
 
@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; 
 
} 
 
}

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

驗證HTTPS和HTTP2開啟成功

重啟服務,即完成了HTTP到HTTPS的升級,且能自動跳轉HTTPS,讓網站更安全。輸入http://localhost:8080/blog/swagger-ui.html后回車地址欄自動跳轉至https://localhost:8443/blog/swagger-ui.html,如圖:

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

使用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; 
 
// 就以 「h3」作為判斷標識 
 
if(spdy && /^h3/i.test(info)) { 
 
return console.info('本站點使用了HTTP/2'); 
 
} 
 
} 
 
console.warn('本站點沒有使用HTTP/2'); 
 
})();

Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS

關于“Spring Boot如何實現Undertow服務器同時支持HTTP2、HTTPS”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

修武县| 闽侯县| 临沭县| 合川市| 永宁县| 康定县| 临邑县| 绥芬河市| 宿迁市| 临汾市| 中江县| 靖宇县| 托克逊县| 灵川县| 永年县| 宜章县| 皋兰县| 唐河县| 当雄县| 额尔古纳市| 开江县| 石渠县| 青海省| 高阳县| 额济纳旗| 五莲县| 四会市| 修水县| 防城港市| 新津县| 怀化市| 新密市| 和龙市| 平定县| 灵寿县| 丰城市| 鹿泉市| 濮阳县| 白山市| 博白县| 盐山县|