Встроенная перезагрузка Jetty не работает должным образом

Я пытаюсь реализовать простое правило перезаписи на встроенном сервере Jetty, следуя примерам документации Jetty.

Я хочу, чтобы запросы /admin/ переписывались в /admin.html. На данный момент, если я запрошу /admin/, я получаю ошибку 404 с /admin.html не найден. Но если я запрошу /admin.html напрямую, он будет работать!

Есть 2 других похожих сообщения в stackoverflow, но ответов на вопрос нет!

Здесь код:

WebAppContext _ctx = new WebAppContext();
_ctx.setContextPath("/");
_ctx.setDefaultsDescriptor(JETTY_DEFAULTS_DESCRIPTOR);
_ctx.setParentLoaderPriority(true);       
_ctx.setWar(getShadedWarUrl());
_ctx.setResourceBase(getShadedWarUrl());

RewriteHandler rewriter = new RewriteHandler();
rewriter.setRewritePathInfo(true);
rewriter.setRewriteRequestURI(true);
rewriter.setOriginalPathAttribute("requestedPath");

RewritePatternRule admin = new RewritePatternRule();
admin.setPattern("/admin/");
admin.setReplacement("/admin.html");
admin.setTerminating(true); // this will stop Jetty from chaining the rewrites
rewriter.addRule(admin);

_ctx.setHandler(rewriter);

HandlerCollection _handlerCollection = new HandlerCollection();
_handlerCollection.setHandlers(new Handler[] {_ctx});
server.setHandlers(_result);

Ответ 1

Заменить 2 строки...

_ctx.setHandler(rewriter);
_handlerCollection.setHandlers(new Handler[] {_ctx});

с

rewriter.setHandler(_ctx);
_handlerCollection.setHandlers(new Handler[] {rewriter});

Это приведет к тому, что правила перезаписывания начнутся до нормальной обработки контекста.

Подумайте об обработке контекста как о дереве. В вашем примере кода у вас есть....

server
+--  HandlerCollection
     [0]-- WebAppContext
           +-- Your servlets and filters in web.xml
           +-- DefaultServlet
               +-- RewriteHandler

Это означает, что если WebAppContext не может обрабатывать запрос, выполняется RewriteHandler, чтобы увидеть, может ли он обрабатывать запрос. Это никогда не произойдет, поскольку WebAppContext настроен на использование DefaultServlet, если ничего не соответствует.

Простая замена предложила изменить дерево таким образом, чтобы это выглядело...

server
+--  HandlerCollection
     [0]-- RewriteHandler
           +-- WebAppContext
               +-- Your servlets and filters in web.xml
               +-- DefaultServlet

Это позволит RewriteHandler выполнить свою задачу до того, как будет задан вопрос WebAppContext.

Примечание: вы также можете использовать свой код для HandlerCollection более корректно для этого сценария.

// _ctx.setHandler(rewriter);
// rewriter.setHandler(_ctx);
_handlerCollection.setHandlers(new Handler[] { rewriter, _ctx });

Это приведет к следующему дереву

server
+--  HandlerCollection
     [0]-- RewriteHandler
     [1]-- WebAppContext
           +-- Your servlets and filters in web.xml
           +-- DefaultServlet