2012-06-05 47 views
0

我试图从同一个Jetty服务器提供静态文件和Thrift服务。到现在为止,我有以下代码:服务同一个Jetty服务器的Thrift/TServlet和静态文件

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(); 

静态文件供应就好了,但节俭的服务一直给我404错误。我究竟做错了什么?


注意:为静态文件的代码是从this question采取和“VAL”类型由project lombok照顾,但我留在了那里,因为我认为目前的代码更易读。

回答

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();