Jetty 9:设置处理程序和连接器

时间:2014-10-01 18:47:19

标签: java jetty embedded-jetty jetty-9

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

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

  2. 或者一切都去主处理程序,然后你从那里分发东西? (即你找出它来自哪个连接器,然后你将它转发给另一个处理程序或自己处理它)

  3. 非常感谢!

1 个答案:

答案 0 :(得分:15)

Connectors是侦听传入连接的组件。

Handlers是用于处理所有请求的低级码头机制。

Jetty向400 Bad Request

注册的任何内容发送所有有效请求(有一类请求,这些请求只是错误的HTTP使用,并可能导致Server.getHandler()之类的内容)

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

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

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

如果处理程序实际生成了某些内容,则调用baseRequest.setHandled(true);用于告知Jetty在当前处理程序之后不再处理任何处理程序。

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

VirtualHosts是ContextHandler特定处理程序中的一个概念,因此您希望将自定义处理程序包装在ContextHandler中以获得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"});