java - jetty 9 : Setting up handlers and connectors

标签 java jetty embedded-jetty jetty-9

我已经查看了关于 Jetty 9 架构的文档 (http://www.eclipse.org/jetty/documentation/current/architecture.html),但我仍然对处理程序和连接器之间的关系感到困惑。

  1. 您能否将处理程序链接到特定的连接器(如果可以,如何?连接器似乎没有 setHandler 方法)?

  2. 还是所有内容都交给主处理程序,然后您从那里分发内容? (即你找出它来自哪个连接器,然后你将它转发给不同的处理程序或自己处理)

非常感谢!

最佳答案

连接器 是监听传入连接的组件。

处理程序 是用于处理所有 请求的低级 jetty 机制。

Jetty 将所有有效请求(有一类请求只是错误的 HTTP 使用,可能导致类似 400 Bad Request 的请求)到在 Server.getHandler 注册的任何内容()

有许多类型的函数特定处理程序,选择最适合您需求的一种并从中扩展,或者围绕更通用的方法包装您的处理程序。

典型的服务器被设置为具有 HandlerList 或 HandlerCollection 以指示可能行为的列表。

每个处理程序都被命中(按顺序),如果该处理程序决定它想做某事它可以。

如果处理程序实际产生了一些东西,则调用 baseRequest.setHandled(true); 用于告诉 Jetty 在当前处理程序之后不再处理任何处理程序。

至于如何将某些处理程序限制到某些连接器,这是通过虚拟主机机制完成的。

VirtualHosts 是融入 ContextHandler 特定处理程序的概念,因此您需要将自定义处理程序包装在 ContextHandler 中以获得 VirtualHosts 的好处。

要使用它,您可以使用 Connector.setName(String) 命名您的连接器,然后在 的 VirtualHosts 定义上使用 @{name} 语法>ContextHandler 到特定的只有那个命名的连接器可以用于服务那个特定的 ContextHandler

例子:

    ServerConnector httpConnector = new ServerConnector(server);
    httpConnector.setName("unsecured"); // named connector
    httpConnector.setPort(80);

    ContextHandler helloHandler = new ContextHandler();
    helloHandler.setContextPath("/hello");
    helloHandler.setHandler(new HelloHandler("Hello World"));
    helloHandler.setVirtualHosts(new String[]{"@unsecured"});

关于java - jetty 9 : Setting up handlers and connectors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26148418/

相关文章:

java - 使用 Jackson 反序列化对象 json 对象列表 - 无法从 start_array token 中反序列化实例

postgresql - 使用 RDS 2019 CA 根证书到 RDS PostgreSQL 的 Jetty + HikariCP + JVM SSL 连接问题

java - 在 Jetty 上部署 Maven Web 项目

maven - Jetty 清理 session 错误与 View 范围的 bean

Java Keystore 无法将 X509Certificate 添加到 Keystore

java - 定时操作产生不可能的结果

C++ 运算符重载的 Java 等价物

java - 使用嵌入式 jetty 创建网络界面

Jetty 9 忽略我的配置 XML

java - 独立启动 WebAppContext