4

I have a project that runs embedded jetty server. Also, i have angularjs-1.2.12.jar in project's dependencies.

How do I configure jetty, to expose files from META-INF/resources. I tried to do the following:

    ResourceHandler resource_handler = new ResourceHandler();
    resource_handler.setDirectoriesListed(true);
    resource_handler.setWelcomeFiles(new String[]{ "index.html" });
    resource_handler.setBaseResource(Resource.newClassPathResource("/"));

    Server server = new Server(8080);
    server.setHandler(resource_handler);

But only files from target/classes are exposed.

Thank you.

UPD: solved

    ResourceHandler resource_handler = new ResourceHandler() {
        @Override
        public Resource getResource(String path)
                throws MalformedURLException {
            Resource resource = Resource.newClassPathResource(path);
            if (resource == null || !resource.exists()) {
                resource = Resource.newClassPathResource("META-INF/resources" + path);
            }
            return resource;
        }
    };
    resource_handler.setDirectoriesListed(true);
    resource_handler.setWelcomeFiles(new String[]{"index.html"});
    resource_handler.setResourceBase("/");
    server.setHandler(resource_handler);
  • What version of Jetty are you using? – James Ward Feb 17 '14 at 00:59
  • 3
    It looks like the solution might expose all resources on the classpath to be served as static assets. If so that could be a big security loophole. This is why the default with Servlet 3 is to only do this for `META-INF/resources` prefixed paths. – James Ward Feb 17 '14 at 18:38

1 Answers1

0

I had the same issue, and after looking all over, your solution was the best. But as pointed out by James Ward in comments, it poses a security issue. Here is my solution, building on yours:

public class MyResourceHandler extends ResourceHandler {
    @Override
    public Resource getResource(String path) {
        Resource resource = Resource.newClassPathResource("META-INF/resources" + path);
        if(resource == null) resource = super.getResource(path);
        return resource;
    }
}

As pointed out here, ResourceHandler is somewhat obsolete. I actually implemented this solution by extending DefaultServlet instead.

MikaelF
  • 3,518
  • 4
  • 20
  • 33