java - Tomcat 9.0.16 Java 11 HTTP/2

标签 java tomcat configuration tls1.2 http2

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 部分中的一个列,您就可以获得所有可用列的概览:

enter image description here

客户端使用的调试协议(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/

相关文章:

java - 将图像图标导出为缓冲图像

java - 如何使用 spring-data-solr 在空间搜索中返回距离和分数

java - 多核 CPU 上的单线程 Node.js 与 Java (Tomcat)

apache - 如何将我的 Web 应用程序从端口号 8080 指向 80?

java log4j.xml 多个附加程序共享一个布局

configuration - MSMQ 创建错误 : A workgroup installation computer does not support the operation/User's internal Message Queuing certificate does not exist

java - 如何正确格式化数字字符串

java - 如何使 Java 代码可供两个项目访问

java - 在一台机器上有两个 webapps 每个都在不同的 servlet 容器上比两个都在同一个容器上是不是很糟糕?

.net - 为什么要将 .net 配置设置编译到程序集中?