在(嵌入式)Jetty中,我正在尝试使用ResourceHandler来提供静态文件和自定义处理程序来响应动态请求。基于this page,我的设置如下:
public static void main(String[] args) throws Exception
{
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(8080);
server.addConnector(connector);
ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setDirectoriesListed(false);
resource_handler.setResourceBase(".");
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, new MyHandler() });
server.setHandler(handlers);
server.start();
server.join();
}
这在正确的意义上有效:
问题是我得到403以响应根路径(/)。 MyHandler能够响应这些请求,但它们首先被ResourceHandler拦截。有没有办法强制Jetty向MyHandler发送/请求?
提前致谢!
答案 0 :(得分:3)
Jetty按顺序尝试每个Handler,直到其中一个处理程序在请求上调用setHandled(true)。不确定为什么ResourceHandler不为“/".
执行此操作我的解决方案是颠倒您列出处理程序的顺序,以便首先调用您的处理程序。然后检查URL中的特殊情况“/”。如果您想将请求传递给ResourceHandler,只需在不声明处理请求的情况下返回。
声明处理程序的顺序如下:
Server server = new Server(8080);
CustomHandler default = new CustomHandler();
default.setServer(server);
ResourceHandler files = new ResourceHandler();
files.setServer(server);
files.setResourceBase("./path/to/resources");
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] {default, files});
server.setHandler(handlers);
server.start();
server.join();
定义CustomHandler的句柄方法,如下所示:
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
if(!request.getRequestURI().equals("/")){
return;
}
// Do Stuff...
baseRequest.setHandled(true);
return;
}
我同意让ResourceHandler简单地在“/”上产生而不是用403来处理响应是最优雅的。
答案 1 :(得分:1)
我的解决方案:
我使用的代码如下所示:
RewriteHandler rewriteHandler = new RewriteHandler();
rewriteHandler.setRewriteRequestURI(true);
rewriteHandler.setRewritePathInfo(false);
rewriteHandler.setOriginalPathAttribute("requestedPath");
RewriteRegexRule rewriteIndex = new RewriteRegexRule();
rewriteIndex.setRegex("^/$");
rewriteIndex.setReplacement("/index.html");
rewriteHandler.addRule(rewriteIndex);
rewriteHandler.setHandler(rootHandlerCollection);
server.setHandler(rewriteHandler);
正则表达式确保只匹配确切的路径,以便" /无论什么"仍然首先由ResourceHandler处理。