我有一個在后端angular使用帶有嵌入式服務器的 Spring Boot 的 Web 應用程式。tomcat我想使已建立的 http 連接保持更長時間,以提高后續 http 請求的回應時間。使用瀏覽器被告知通過添加和類似的東西來http/1.1保持 http 連接。但是,HTTP/2 中禁止連接特定的標頭欄位,例如 Connection 和 Keep-Alive 。因此,Chrome 和 Firefox 在 HTTP/2 回應中會忽略它們。對于 HTTP/2,連接特定的元資料應該通過其他方式來傳達。Connection: Keep-AliveKeep-Alive: timeout=5, max=1000response header
我在任何地方都找不到那些“其他手段”應該是什么。我也找不到任何地方如何配置嵌入式 Tomcat 9 服務器以將Keep-alive元資料添加到HTTP/2回應中。這是現在配置tomcat的方式:
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return (tomcat) -> tomcat.addConnectorCustomizers((connector) -> {
if (connector.getProtocolHandler() instanceof AbstractHttp11Protocol) {
AbstractHttp11Protocol<?> protocolHandler = (AbstractHttp11Protocol<?>) connector
.getProtocolHandler();
protocolHandler.setDisableUploadTimeout(false);
protocolHandler.setConnectionUploadTimeout(5000);
protocolHandler.setKeepAliveTimeout(4000);
protocolHandler.setMaxKeepAliveRequests(200);
protocolHandler.setUseKeepAliveResponseHeader(true);
}
});
}
但是如果我想使用這些設定將不起作用。有HTTP/2什么想法嗎?
uj5u.com熱心網友回復:
在 http/1.1 中,瀏覽器被告知通過在回應頭中添加 Connection: Keep-Alive 和 Keep-Alive: timeout=5, max=1000 之類的東西來保持 http 連接處于活動狀態。
事實并非如此。從 HTTP/1.1Connection: Keep-Alive開始,除非明確設定為Close. 我們甚至擁有標頭的事實更像是 HTTP/1.0 天遺留下來的,不需要設定。回應總是更能說明服務器將做什么,而不是向客戶端發出指令(“嘿,僅供參考,我將使用這些設定”)但它也總是有點毫無意義,因為服務器(和客戶端)如果它想要也可以斷開連接。如果一個服務器的 TCP 連接用完了,它不應該真正保留一個沒有被使用的舊的連接,而不是接受一個新的連接。
但是,HTTP/2 中禁止連接特定的標頭欄位,例如 Connection 和 Keep-Alive。因此,Chrome 和 Firefox 在 HTTP/2 回應中會忽略它們。對于 HTTP/2,連接特定的元資料應該通過其他方式來傳達。
我在任何地方都找不到那些“其他手段”應該是什么。我也找不到任何地方如何配置嵌入式 Tomcat 9 服務器以將 Keep-alive 元資料添加到 HTTP/2 回應。這是現在配置tomcat的方式:
與以前一樣,HTTP/2 只是擺脫了相當無意義的標頭,并假設您希望使其保持活動狀態。它在 HTTP/2 中也沒有多大意義,因為它用于多個請求和回應,而 HTTP/1.1 一次只用于一個,并且 keep-alive 是連接級別的設定。因此,如果一個 HTTP/2 請求可以指定一個keep-alive: close,那對于該連接上已經在進行中的其他請求意味著什么?同樣,將其設定為HTTP/2 的多路復用keep-alive的本質也暗示了它。
由客戶端和服務器根據自己的邏輯和資源限制來決定何時最好地斷開連接,盡管HTTP/2 規范稍后會繼續說:
HTTP/2 連接是持久的。為了獲得最佳性能,預計客戶端不會關閉連接,直到確定不需要與服務器進行進一步通信(例如,當用戶導航離開特定網頁時)或直到服務器關閉連接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/411839.html
標籤:
上一篇:在mutate中應用函式或回圈
