TLS 是否仍然是在最新的 Java 和 Tomcat 上使用 HTTP/2 的先决条件?我可以添加 <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol"/>
吗?到 HTTP 端口 8080 并期望 HTTP/2 工作?如何实际测试/查看实际使用的是 HTTP/2 而不是 HTTP?任何命令行/浏览器工具?谢谢。
最佳答案
作为HTTP Connector howto状态:
HTTP/2 is support is provided for TLS (h2), non-TLS via HTTP upgrade (h2c) and direct HTTP/2 (h2c) connections. To enable HTTP/2 support for an HTTP connector the following UpgradeProtocol element must be nested within the Connector with a className attribute of
org.apache.coyote.http2.Http2Protocol
.
这表明 TLS 不是必需的。问题仍然是您的浏览器是否支持 h2c
升级。
使用 Firefox,按 (F12) 打开开发者工具,导航到 Networkanalysis。在那里您会看到一个表格,其中显示了每个请求的多个属性。 如果不存在,请添加 Protocol 列,它告诉您每个请求是否使用 HTTP/1、h2c 或任何其他协议(protocol)。 Chrome 也以类似的方式提供协议(protocol)信息:
只需右键单击开发人员工具 Netowrk 部分中的一个列,您就可以获得所有可用列的概览:
客户端使用的调试协议(protocol)的另一种替代方法是访问日志记录。只需在 \apache-tomcat\webapps\ROOT\META-INF\
中的默认 ROOT
webapp 中创建一个 context.xhtml
,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Valve className="org.apache.catalina.valves.AccessLogValve"/>
</Context>
重启 Tomcat 并执行一些请求后,您会发现一个 \apache-tomcat\logs\localhost_access_log.2019-03-12.txt
,它准确说明了每个请求使用的协议(protocol):
... - - [12/Mar/2019...] "GET / HTTP/1.1" 200 11488
... - - [12/Mar/2019...] "GET / HTTP/1.1" 200 11488
... - - [12/Mar/2019...] "GET / HTTP/2.0" 200 11468
在我的例子中,第一个请求是使用 Chrome 和 Firefox 完成的,第三个请求是使用您在其他答案中写的命令 curl -v --http2 localhost:8080
完成的。
关于java - Tomcat 9.0.16 Java 11 HTTP/2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55113844/