Hi,
I've created a demo application to demonstrate the issue I'm having:
package jetty.demo;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.util.resource.Resource;
import org.eclipse.jetty.util.resource.ResourceCollection;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.EnumSet;
public class EmbeddedDocsWebApp
{
public EmbeddedDocsWebApp() {
}
public static void main(String[] args)
{
System.setProperty("org.eclipse.jetty.LEVEL","DEBUG");
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(8181);
server.addConnector(connector);
String contextPath = "/all-docs";
jetty.demo.EmbeddedDocsWebApp webApp = new jetty.demo.EmbeddedDocsWebApp();
ServletContextHandler context = webApp.createDocsWebApp(contextPath);
server.setHandler(context);
try
{
server.start();
server.dump(System.err);
server.join();
}
catch (Throwable t)
{
t.printStackTrace(System.err);
}
}
private ServletContextHandler createDocsWebApp(final String contextPath) {
try {
final ResourceHandler resourceHandler = new ResourceHandler();
resourceHandler.setDirectoriesListed(false);
final File codeDocsDir = new File("/tmp/code-docs");
final Resource codeDocsResource = Resource.newResource(codeDocsDir);
// Load the component documentation working directory
final File userGuideDocsDir = new File("/tmp/user-guide-docs");
final Resource userGuideDocsResource = Resource.newResource(userGuideDocsDir);
// Create resources for three docs locations - User Guides, Processor Docs, NiFi Web API
final ResourceCollection resources = new ResourceCollection(codeDocsResource, userGuideDocsResource);
resourceHandler.setBaseResource(resources);
// Create the context handler
final ServletContextHandler handler = new ServletContextHandler();
FilterHolder frameOptions = new FilterHolder(FRAME_OPTIONS_FILTER);
frameOptions.setName("X-Frame-Options");
// <!-- This is the filter that does not get called when a request is made to localhost:8181/all-docs -->
handler.addFilter(frameOptions, "/*", EnumSet.allOf(DispatcherType.class));
handler.setContextPath(contextPath);
handler.insertHandler(resourceHandler);
System.out.println("Loading documents web app with context path set to " + contextPath);
return handler;
} catch (Exception ex) {
System.out.println("Unhandled Exception in createDocsWebApp: " + ex.getMessage());
return null; // required by compiler, though never be executed.
}
}
private static final Filter FRAME_OPTIONS_FILTER = new Filter() {
private static final String FRAME_OPTIONS = "X-Frame-Options";
private static final String SAME_ORIGIN = "SAMEORIGIN";
@Override
public void doFilter(final ServletRequest req, final ServletResponse resp, final FilterChain filterChain)
throws IOException, ServletException {
// set frame options accordingly
final HttpServletResponse response = (HttpServletResponse) resp;
response.setHeader(FRAME_OPTIONS, SAME_ORIGIN);
filterChain.doFilter(req, resp);
}
@Override
public void init(final FilterConfig config) {
}
@Override
public void destroy() {
}
};
}
In this case, when hitting localhost:8181/all-docs, the ResourceHandler returns the static resources but does not apply the X-Frame-Options header using the FRAME_OPTIONS_FILTER. How do I get this target to hit the Filter before handling the static resource request?
Thanks in advance.