Harald
Harald

Reputation: 5093

Redirecting root context path or binding it to a servlet or mapping it with a welcome-file

I am using Jetty-9 in embedded mode and need only one web application. Consequently I would like the root URL to go to the homepage of that application, i.e. something like

http://localhost:4444/

should end up in a servlet. I start out with:

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

None of the following worked, neither

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

nor

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

where /lists is mapped to the ListsServlet servlet. All I get is a 403 (Forbidden).

I do not use the DefaultServlet, which seems to handle welcome files. But since the ServletContextHandler has setWelcomeFiles I expected it to contain the logic to use them.

Any ideas?

Upvotes: 3

Views: 4012

Answers (1)

Joakim Erdfelt
Joakim Erdfelt

Reputation: 49462

For the 403 Forbidden error, you have some security setup that is not allowing you to access the handlers/servlets.

Eliminate that security (for now), verify that the rest is working, then add security a bit later to lock down specifics.

If you want to see some the suggestions below at work, consider looking at the code example in the answer from another stackoverflow: How to correctly support html5 <video> sources with jetty.

Welcome files are appended to the incoming request path if there is nothing present at that location. For example requesting a directory and then a welcome-file of 'index.html' is appended to the request path.

While this would work ...

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,"/");

It's likely not what you are aiming for, as you said the root path only. The above would also make changes to requests like /foo/ to /foo/lists

Instead, it might make more sense to use a Rewrite rule + handler instead of the welcome-files approach.

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);

This RewritePatternRule simply changes any request path / to /list and then forwards that request to the wrapped ssContext (if you want to see the /list on the browser, change it to a RedirectPatternRule instead.

Upvotes: 3

Related Questions