我在嵌入模式下使用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
,它似乎处理欢迎文件。但由于ServletContextHandler
有setWelcomeFiles
,我希望它包含使用它们的逻辑。
有什么想法吗?
答案 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
。