10

我正在尝试按照 Jetty 文档示例在嵌入式 Jetty 服务器中实现一个简单的重写规则。

我希望请求/admin/重写为 /admin.html。目前,如果我请求/admin/我得到一个 404 错误,/admin.html但未找到。但是,如果我直接请求/admin.html,它会起作用!

stackoverflow 上还有 2 个其他类似的帖子,但没有答案!

这是代码:

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

1 回答 1

17

替换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
于 2013-01-22T21:07:06.613 回答