如何使用 Tomcat 8.5 和 Java SE 8 支持 HTTP2

Kon*_*ine 3 java tomcat servlets http2

我正在研究 HTTP2 以及我们在应用程序中使用它的可能性。目前我们正在 Java 8 中开发并使用 Tomcat 8.5.24(这意味着我们使用 Servlet 3.1)。我在网上搜索过,但找不到任何关于如何利用 HTTP2 功能的资源。

我能找到的唯一示例是使用 Servlet 4.0(从我看到的情况来看,它仅受 Tomcat 9 支持)并且唯一展示的是在PushBuilder客户端请求和 html 页面时使用 a来推送 css 和 js 文件。

我能否通过 HTTP2 使用 Servlet 3.1 提供的异步 API?Servlet 3.1 是否支持 HTTP2?如果没有,Tomcat 8.5 支持 HTTP2 的意义何在?仅用于推送网络资源?

sko*_*isa 6

首先,一些基本点:

  • 您必须使用 Servlet 4.0 来实现服务器推送。3.1 等早期版本中不存在该 API。
  • Servlet 规范现在属于 Java EE(“Jakarata EE”)的保护伞,而 Servlet 4.0 规范是 Java EE 8 的一部分。
  • 因此,要在 servlet 中实现服务器推送,您必须使用 EE 8。您不能使用 EE 7。
  • 但是,您可以在 EE 8 中使用 JDK 8 或更高版本。无需转到 JDK 9。
  • Tomcat 提供了一个有用的表,用于将任何 Tomcat 版本与支持的 Java 和 servlet 版本相关联。
  • 以下服务器支持 Java EE 8:GlassFish 5.x、Payara 5.x 和 Tomcat 9.x。您不能使用 Tomcat 8.5。

要解决您的具体问题:

我能否通过 HTTP2 使用 Servlet 3.1 提供的异步 API?

是的。它仍然有 4.0 规范。

Servlet 3.1 是否支持 HTTP2?

不可以。Servlet 4.0 规范的附录 A1 明确指出与 3.1 相比的一个变化是“支持 HTTP/2 的要求”。

如果没有,Tomcat 8.5 支持 HTTP2 的意义何在?

因为 HTTP/2 中存在独立于 servlet 的特性。请参阅有关其 HTTP/2 支持的 Tomcat 8.5 文档。例如,虽然您无法实现 HTTP/2 服务器推送,但您仍然可以使用 Tomcat 8.5 实现 HTTP/2 标头压缩。

仅用于推送网络资源?

不。HTTP/2 是关于性能的,而服务器推送只是一个特性:

  • 是二进制的,而不是文本的
  • 完全复用,而不是有序和阻塞
  • 因此可以使用一个连接进行并行
  • 使用标头压缩来减少开销
  • 允许服务器主动将响应“推送”到客户端缓存中

最后,还有一些相关的事项值得注意:

  • 虽然 HTTP/2 本身不需要使用 https,但实际上它是必需的,因为“目前没有浏览器支持未加密的 HTTP/2 ”。
  • 所有流行的浏览器都已经完全支持 HTTP/2。
  • 据我所知,没有什么可以阻止使用任何主要的 IDE(Intellij IDEA、Eclipse、STS、NetBeans)来开发和测试 HTTP/2 功能。