我已经查看了有关架构的 Jetty 9 文档(http://www.eclipse.org/jetty/documentation/current/architecture.html),但我仍然对处理程序和连接器之间的关系感到困惑。
您可以将处理程序链接到特定的连接器(如果可以,如何连接?连接器似乎没有 setHandler 方法)?
还是一切都交给主处理程序,然后你从那里分发东西?(即您找出它来自哪个连接器,然后将其转发给不同的处理程序或自己处理)
非常感谢!
我已经查看了有关架构的 Jetty 9 文档(http://www.eclipse.org/jetty/documentation/current/architecture.html),但我仍然对处理程序和连接器之间的关系感到困惑。
您可以将处理程序链接到特定的连接器(如果可以,如何连接?连接器似乎没有 setHandler 方法)?
还是一切都交给主处理程序,然后你从那里分发东西?(即您找出它来自哪个连接器,然后将其转发给不同的处理程序或自己处理)
非常感谢!
Connectors
是侦听传入连接的组件。
Handlers
是用于处理所有请求的低级码头机制。
Jetty 将所有有效请求(有一类请求只是糟糕的 HTTP 使用,并可能导致类似 a 400 Bad Request
)发送到注册的任何内容Server.getHandler()
有许多类型的函数特定处理程序,选择最适合您需求的一种并从中扩展,或者将您的处理程序包装在更通用的方法上。
典型的服务器设置为具有 HandlerList 或 HandlerCollection 来指示可能行为的列表。
每个处理程序都被击中(按顺序),如果该处理程序决定它想要做一些它可以做的事情。
如果一个处理程序确实产生了一些东西,那么调用 来baseRequest.setHandled(true);
告诉 Jetty 在当前处理程序之后不再处理任何处理程序。
至于如何将某些处理程序限制到某些连接器,这是通过 virtualhosts 机制完成的。
VirtualHosts 是一个融入ContextHandler
特定处理程序的概念,因此您需要将自定义处理程序包装在 aContextHandler
中以获得 VirtualHosts 的好处。
要使用它,您将使用命名您的连接器Connector.setName(String)
,然后使用@{name}
VirtualHosts 定义中的语法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"});