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

Crr*_*rro 3 java jetty embedded-jetty jetty-9

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

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

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

非常感谢!

Joa*_*elt 15

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

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

Jetty发送所有有效的请求(有一类请求,这些请求只是糟糕的HTTP使用情况,并且可能会产生类似a的内容400 Bad Request).Server.getHandler()

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

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

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

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

至于如何将某些处理程序限制为某些连接器,这是通过virtualhosts机制完成的.

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"});
Run Code Online (Sandbox Code Playgroud)

  • 没有`baseRequest.setHandled(true);`请求处理将继续到下一个处理程序,正确. (3认同)