3

我在嵌入式模式下使用 Jetty-9,并且只需要一个 Web 应用程序。因此,我希望根 URL 转到该应用程序的主页,即类似于

http://localhost:4444/

最终应该是一个 servlet。我开始:

ServletContextHandler scContext = 
        new ServletContextHandler(ServletContextHandler.SESSIONS);
scContext.setContextPath("/");

以下都没有奏效,也没有

scContext.addServlet(ListsServlet.class, "/");

也不

scContext.setWelcomeFiles(new String[]{"/lists})

where/lists映射到ListsServletservlet。我得到的只是一个 403(禁止)。

我不使用DefaultServlet似乎处理欢迎文件的 . 但是由于我期望ServletContextHandlersetWelcomeFiles包含使用它们的逻辑。

有任何想法吗?

4

1 回答 1

3

对于该403 Forbidden错误,您有一些不允许您访问处理程序/servlet 的安全设置。

消除该安全性(暂时),验证其余部分是否正常工作,然后稍后添加安全性以锁定细节。

如果您想在工作中看到以下一些建议,请考虑查看另一个 stackoverflow 答案中的代码示例:如何使用 jetty 正确支持 html5 <video> 源

如果该位置没有任何内容,欢迎文件将附加到传入请求路径。例如,请求一个目录,然后将“index.html”的欢迎文件附加到请求路径。

虽然这会起作用......

scContext.setWelcomeFiles(new String[]{"lists"})

// Add Default Servlet (must be named "default")
ServletHolder holderDefault = new ServletHolder("default",DefaultServlet.class);
holderDefault.setInitParameter("resourceBase",baseDir.getAbsolutePath());
holderDefault.setInitParameter("dirAllowed","true");
holderDefault.setInitParameter("welcomeServlets","true");
holderDefault.setInitParameter("redirectWelcome","true");

scContext.addServlet(holderDefault,"/");

正如您所说的仅根路径,这可能不是您的目标。以上内容也会对请求进行更改,/foo/例如/foo/lists

相反,使用重写规则 + 处理程序而不是欢迎文件方法可能更有意义。

RewriteHandler rewrite = new RewriteHandler();
rewrite.setHandler(scContext);

RewritePatternRule rootRule = new RewritePatternRule();
rootRule.setPattern("/");
rootRule.setReplacement("/list");
rootRule.setTerminating(true);
rewrite.addRule(rootRule);

server.setHandler(rewrite);

RewritePatternRule只是将任何请求路径更改//list,然后将该请求转发给已包装的请求ssContext(如果您想/list在浏览器上查看 ,请将其更改为 a RedirectPatternRule

于 2014-10-06T12:27:10.247 回答