在Jetty中使用ResourceHandler和自定义处理程序时获取403请求

时间:2012-10-07 05:55:30

标签: jetty embedded-jetty

在(嵌入式)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();
}

这在正确的意义上有效:

  • 提供公共目录中文件的静态内容,例如/public/style.css
  • 在公共目录中不存在的路径上运行MyHandler,例如/ foo / bar

问题是我得到403以响应根路径(/)。 MyHandler能够响应这些请求,但它们首先被ResourceHandler拦截。有没有办法强制Jetty向MyHandler发送/请求?

提前致谢!

2 个答案:

答案 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)

我的解决方案:

  • 将MyHandler放在与" /"不同的上下文路径上例如" /索引"
  • 使用重写规则来拦截对" /"的调用并将它们重定向到" / index"

我使用的代码如下所示:

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处理。