我正在尝试按照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);
答案 0 :(得分:16)
替换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