首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring中使用Tomcat启用HTTP2

在Spring中使用Tomcat启用HTTP2
EN

Stack Overflow用户
提问于 2016-07-27 12:16:09
回答 5查看 51.6K关注 0票数 46

Tomcat8.5将是SpringBoot1.4中的默认版本,它支持HTTP/2

如何在Spring应用程序中启用HTTP/2

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-04-04 12:43:45

使用Spring应用程序启用HTTP/2的最优雅和性能最好的方法如下所示。

首先,正如的答案中提到的,您需要在Tomcat级别启用HTTP/2:

代码语言:javascript
复制
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
    return (container) -> {
        if (container instanceof TomcatEmbeddedServletContainerFactory) {
            ((TomcatEmbeddedServletContainerFactory) container)
                    .addConnectorCustomizers((connector) -> {
                connector.addUpgradeProtocol(new Http2Protocol());
            });
        }
    };
}

如果您没有使用嵌入式Tomcat,可以设置HTTP/2侦听,如下所示:

代码语言:javascript
复制
<Connector port="5080" protocol="HTTP/1.1" connectionTimeout="20000">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>

请记住,您需要Tomcat >= 8.5。

然后,您应该在Tomcat前面使用HAProxy (version 1.7)来处理加密问题。

客户端将与HAProxy对话https,而HAProxy将根据客户端的请求向后端讲明文HTTP/1.1或HTTP/2。不会有不必要的协议翻译。

匹配的HAProxy配置如下:

代码语言:javascript
复制
# Create PEM: cat cert.crt cert.key ca.crt > /etc/ssl/certs/cert.pem

global
    tune.ssl.default-dh-param 2048
    ssl-default-bind-options no-sslv3 no-tls-tickets force-tlsv12
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
    chroot /var/lib/haproxy
    user haproxy
    group haproxy

defaults
    timeout connect 10000ms
    timeout client 60000ms
    timeout server 60000ms

frontend fe_https
    mode tcp
    rspadd Strict-Transport-Security:\ max-age=31536000;\ includeSubDomains;\ preload
    rspadd X-Frame-Options:\ DENY
    bind *:443 ssl crt /etc/ssl/certs/cert.pem alpn h2,http/1.1
    default_backend be_http

backend be_http
    mode tcp
    server domain 127.0.0.1:8080
    # compression algo gzip # does not work in mode "tcp"
    # compression type text/html text/css text/javascript application/json

编辑2019

在使用"tcp“模式时,我面临两个问题。

  • 压缩不起作用,因为它依赖于模式http。所以后端必须处理它
  • 后端无法看到客户端的IP地址。也许我需要纳特。还在调查..。

通常,由于http代理的是较低级别的tcp连接,因此无法访问任何http内容。

票数 25
EN

Stack Overflow用户

发布于 2018-05-16 07:56:22

Spring Boot 2.1及以上中,将此属性添加到.properties (或.yml)文件中非常简单:

代码语言:javascript
复制
server.http2.enabled=true

您还可以通过编程方式(在您的一个配置类中)这样做:

代码语言:javascript
复制
@Bean
public ConfigurableServletWebServerFactory tomcatCustomizer() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.addConnectorCustomizers(connector -> connector.addUpgradeProtocol(new Http2Protocol()));
    return factory;
}
票数 55
EN

Stack Overflow用户

发布于 2016-07-27 12:55:19

您需要向Tomcat的连接器添加HTTP 2升级协议。您可以通过自定义嵌入的Tomcat容器来做到这一点:

Java 8:

代码语言:javascript
复制
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
    return (container) -> {
        if (container instanceof TomcatEmbeddedServletContainerFactory) {
            ((TomcatEmbeddedServletContainerFactory) container)
                    .addConnectorCustomizers((connector) -> {
                connector.addUpgradeProtocol(new Http2Protocol());
            });
        }
    };
}

Java 7:

代码语言:javascript
复制
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
    return new EmbeddedServletContainerCustomizer() {

        @Override
        public void customize(ConfigurableEmbeddedServletContainer container) {
            if (container instanceof TomcatEmbeddedServletContainerFactory) {
                ((TomcatEmbeddedServletContainerFactory) container)
                        .addConnectorCustomizers(new TomcatConnectorCustomizer() {
                    @Override
                    public void customize(Connector connector) {
                        connector.addUpgradeProtocol(new Http2Protocol());
                    }

                });
            }
        }

    };
}
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38612704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档