嵌入式 Jetty 重写无法正常工作

2024-03-08

我正在尝试按照 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);

替换 2 行...

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

with

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

这将使重写规则生效before正常的上下文处理。

将上下文处理视为一棵树。在你的示例代码中你有......

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式 Jetty 重写无法正常工作 的相关文章

随机推荐