【问题标题】:Can't use two connectors (http and https) in Jetty v.9.4.3不能在 Jetty v.9.4.3 中使用两个连接器(http 和 https)
【发布时间】:2017-12-22 22:59:50
【问题描述】:

当我向嵌入式 Jetty 服务器添加两个连接器时,我既不能使用 HTTP 也不能使用 HTTPS - 浏览器/curl 只是卡住了。我用来创建嵌入式 Jetty 的代码大致如下(基于此示例 - http://self-learning-java-tutorial.blogspot.de/2015/10/jetty-configuring-many-connectors.html):

HttpConfiguration httpConfiguration = new HttpConfiguration();
httpConfiguration.setRequestHeaderSize(requestHeaderSize);

ServerConnector httpConnector= new ServerConnector(server, 1, -1, new 
    HttpConnectionFactory(httpConfiguration));
httpConnector.setPort(getPort());
httpConnector.setReuseAddress(true);
httpConnector.setIdleTimeout(maxTimeout);
server.addConnector(httpConnector);

HttpConfiguration httpsConfiguration = new HttpConfiguration();
httpsConfiguration.setSecureScheme("https");
httpsConfiguration.setSecurePort(securePort);
httpsConfiguration.addCustomizer(new SecureRequestCustomizer());

ServerConnector sslConnector = new ServerConnector(server,
            new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
            new HttpConnectionFactory(httpsConfiguration));
sslConnector.setPort(securePort);
sslConnector.setIdleTimeout(maxTimeout);
sslConnector.setReuseAddress(true);

server.addConnector(sslConnector);

ServletContextHandler servContext = new 
ServletContextHandler(ServletContextHandler.NO_SESSIONS);
servContext.setContextPath("/");
server.setHandler(servContext);
server.start();

我在 org.eclipse.jetty 中打开了调试日志,在任何请求下我都会得到以下信息:

 Selector loop woken up from select, 0/1 selected [] [io.ManagedSelector][jetty-default-3]
 Running action org.eclipse.jetty.io.ManagedSelector$Accept@4278b8a5 [][io.ManagedSelector] [jetty-default-3]
 Queued change org.eclipse.jetty.io.ManagedSelector$CreateEndPoint@535fb063 on org.eclipse.jetty.io.ManagedSelector@3959754c id=3 keys=2 selected=0 [] [io.ManagedSelector] [jetty-default-3]
 EatWhatYouKill@1289003f/org.eclipse.jetty.io.ManagedSelector$SelectorProducer@7ff1b622/PRODUCING/0/1->PRODUCING/0/1 PEC org.eclipse.jetty.io.ManagedSelector$CreateEndPoint@535fb063 [] [strategy.EatWhatYouKill] [jetty-default-3]
 Selector loop waiting on select [] [io.ManagedSelector] [jetty-default-3]

当只添加一个连接器时,一切都按预期工作。

附:所以问题"Selector loop waiting on select" when running multiple test cases which use wiremock stubsJetty+Jersey infinite loop with curl post query 没有给出任何答案,除了它是 9.3 中修复的码头错误(我使用 9.4.3)

【问题讨论】:

  • 你在做什么,你分享的链接在做什么是不同的。该链接正确使用了 2 个嵌套的 HttpConfiguration 对象,但您没有。
  • 我改了代码,使用了嵌套对象,结果还是一样
  • 事实上,我最终启动了两台 Jetty 服务器——一台使用 HTTP,一台使用 HTTPS。我相信 HTTP 工作正常,而后者在 ManagedSelector 中无法进入无限循环。
  • 这也不正确。您将无法以一种有意义的方式在 http -> https 之间重定向(不保留服务器/应用程序/会话/请求上下文)

标签: java jetty embedded-jetty jetty-9


【解决方案1】:

Embedded Jetty 在一台服务器上支持尽可能多的连接器。 Jetty 没有技术限制(唯一存在的限制是您环境中的操作系统和网络堆栈)

请务必注意,您必须有一个健全的 HttpConfiguration 设置。 因为他们可以参考彼此的连接器。 (这是为了“安全”行为、安全约束等)

虽然可以有多个简单的连接器彼此不知道,但这不是一般用例。

使用 HTTPS(也称为 HTTP over TLS/SSL)时,证书(大小、类型、算法等)和密码套件的选择会影响您连接到该 HTTPS 连接器的能力。

请注意,HTTPS 是 TLS(不是 SSL),Jetty 可以使用 TLS 的 ALPN 扩展,允许客户端协商下一个实际使用的协议(无论是 HTTP/1.x 或 HTTP/2 还是您配置的任何协议下一个协议列表是)

以下是嵌入式 Jetty 中多个连接器的几个示例。

eclipse/jetty.project - embedded/ManyConnectors.java

eclipse/jetty.project - embedded/LikeJettyXml.java

jetty-project/embedded-jetty-cookbook - ConnectorSpecificContexts.java

jetty-project/embedded-jetty-cookbook - ConnectorSpecificWebapps.java

jetty-project/embedded-jetty-cookbook - SecuredRedirectHandlerExample.java

jetty-project/embedded-jetty-cookbook - ServletTransportGuaranteeExample.java

【讨论】:

  • 感谢您的链接,Joakim。问题根本不在于 HTTPS——我不能在不同的端口上添加两个 HTTP 连接器——它们都不起作用。在日志中,我看到 Selector loop 从 select 中唤醒,0/0 选择 Running action org.eclipse.jetty.io.ManagedSelector$Accept@ Queued change org.eclipse.jetty.io.ManagedSelector$CreateEndPoint@ EatWhatYouKill@4148db48/org。 eclipse.jetty.io.ManagedSelector$SelectorProducer 选择器循环等待选择
  • 忽略选择器循环消息,这是一条红鲱鱼,与您的问题无关。
  • 示例ConnectorSpecificContextsConnectorSpecificWebapps 添加了2 个不同的HTTP 连接器。
猜你喜欢
  • 2018-07-03
  • 2013-04-14
  • 2015-04-23
  • 1970-01-01
  • 2017-11-09
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多