重定向根上下文路径或将其绑定到servlet或使用welcome-file映射它

时间:2014-10-05 15:45:12

标签: jetty embedded-jetty jetty-9 welcome-file

我在嵌入模式下使用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})

其中/lists映射到ListsServlet servlet。我得到的只是403(禁止)。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

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

如果您想在工作中看到以下建议,请考虑查看另一个stackoverflow的答案中的代码示例:How to correctly support html5 <video> sources with jetty

如果该位置没有任何内容,欢迎文件将附加到传入请求路径。例如,请求目录,然后将“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在浏览器上,将其更改为RedirectPatternRule

相关问题