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