I am embedding jetty into my app, and trying to work out how to add servlet filters (for cookie handling). The wiki and the javadoc’s dont make it very clear, what am I missing:
Server server = new Server(port); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); FilterHolder f = new FilterHolder(new AuthorisationFilter()); context.addFilter(... f ...); // ????? context.addServlet(new ServletHolder(new TestServlet()), "/");
The only info I have found on this is a forum post suggesting the documentation on this needs to be improved.
Advertisement
Answer
Update: For Jetty version 9.2.2:
Server server = new Server(); // Note: if you don't want control over type of connector, etc. you can simply // call new Server(<port>); ServerConnector connector = new ServerConnector(server); connector.setHost("0.0.0.0"); connector.setPort(8085); // Setting the name allows you to serve different app contexts from different connectors. connector.setName("main"); server.addConnector(connector); WebAppContext context = new WebAppContext(); context.setContextPath("/"); // For development within an IDE like Eclipse, you can directly point to the web.xml context.setWar("src/main/webapp"); context.addFilter(MyFilter.class, "/", 1); HandlerCollection collection = new HandlerCollection(); RequestLogHandler rlh = new RequestLogHandler(); // Slf4j - who uses anything else? Slf4jRequestLog requestLog = new Slf4jRequestLog(); requestLog.setExtended(false); rlh.setRequestLog(requestLog); collection.setHandlers(new Handler[] { context, rlh }); server.setHandler(collection); try { server.start(); server.join(); } catch (Exception e) { // Google guava way throw Throwables.propagate(e); }
Original answer ===
If you don’t want to use web.xml then use this:
SocketConnector socketConnector = new SocketConnector(); socketConnector.setPort(7000); // Change to port you want Server server.setConnectors(new Connector[] { socketConnector }); WebAppContext webapp = new WebAppContext(); webapp.setContextPath("/"); // For root webapp.setWar("/"); // Appropriate file system path. // Now you can use the various webapp.addFilter() methods webapp.addFilter(MyFilter.class, "/test", 1); // Will serve request to /test. // There are 3 different addFilter() variants. // Bonus ... request logs. RequestLogHandler logHandler = new RequestLogHandler(); NCSARequestLog requestLog = new NCSARequestLog("/tmp/jetty-yyyy_mm_dd.request.log"); requestLog.setRetainDays(90); requestLog.setAppend(true); requestLog.setExtended(false); requestLog.setLogTimeZone("GMT"); logHandler.setRequestLog(requestLog); logHandler.setHandler(webapp); HandlerList handlerList = new HandlerList(); handlerList.addHandler(logHandler); server.setHandler(handlerList); server.start();
If you do want to use web.xml, instead of the addFilter() methods, just make sure you have a WEB-INF/web.xml in your webapp root path with the following xml:
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <filter> <filter-name>filterName</filter-name> <filter-class>com.x.y.z.FilterClass</filter-class> </filter> <filter-mapping> <url-pattern>/test</url-pattern> <filter-name>filterName</filter-name> </filter-mapping> </web-app>