从同一Jetty服务器提供Thrift / TServlet和静态文件

时间:2012-06-05 16:17:06

标签: java servlets jetty thrift embedded-jetty

我正在尝试从同一个Jetty服务器提供静态文件和Thrift服务。到目前为止,我有以下代码:

val server = new Server();
val connector = new SelectChannelConnector();
connector.setPort(4567);
server.addConnector(connector);

val servlet_handler = new ServletContextHandler(server,"/thrift",ServletContextHandler.SESSIONS);
servlet_handler.addServlet(new ServletHolder(new SomeThriftServlet()), "/thrift/*");

val resource_handler = new ResourceHandler();
resource_handler.setWelcomeFiles(new String[]{ "index.html" });
resource_handler.setResourceBase(".");

val handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, servlet_handler, new DefaultHandler() });
server.setHandler(handlers);

server.start();
server.join();

静态文件服务很好,但Thrift服务不断给我404错误。我做错了什么?


注意:提供静态文件的代码取自this question,{val}类型由project lombok处理,但我将它们留在那里因为我认为当前的代码更具可读性。

1 个答案:

答案 0 :(得分:0)

问题的关键在于你必须将ResourceHandler包装在它自己的上下文中,然后为这两个(或更多)上下文提供它们自己的基本路径。这是因为ResourceHandler没有自己的基本路径。

在此之后,您可以在ContextHandlerCollection中向服务器提供上下文,该上下文根据最长匹配路径前缀确定要使用的上下文。

Server server = new Server();

val connector = new SelectChannelConnector();
connector.setPort(4567);
server.addConnector(connector);

val thr = new SomeThriftServlet();

val ct0 = new ServletContextHandler(ServletContextHandler.SESSIONS);
ct0.setContextPath("/thr");
ct0.addServlet(new ServletHolder(thr), "/*");

val rsc = new ResourceHandler();
rsc.setDirectoriesListed(true);
rsc.setWelcomeFiles(new String[]{ "index.html" });
rsc.setResourceBase(".");

val ct1 = new ContextHandler();
ct1.setContextPath("/rsc");
ct1.setHandler(rsc);

val contexts = new ContextHandlerCollection();
contexts.setHandlers(new Handler[] {ct0, ct1, new DefaultHandler() });

server.setHandler(contexts);

server.start();
server.join();