如何使用嵌入式jetty添加servletfilter

我正在将jetty嵌入到我的应用程序中,并试图找出如何添加servletfilter(用于cookie处理)。 wiki和javadoc没有说清楚,我错过了什么:

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

我在此发现的唯一信息是一个论坛post,建议有关此文档的文档需要改进。

更新:对于Jetty版本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(); 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); } 

原始答案===

如果您不想使用web.xml,请使用以下命令:

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

如果您确实想使用web.xml而不是addFilter()方法,请确保您的webapp根路径中有一个WEB-INF / web.xml,其中包含以下xml:

     filterName com.xyzFilterClass   /test filterName   

我遇到了同样的问题,但我认为Καrτhικ的答案太复杂了。 我找到了这个简单的方法:

 Server server = new Server(8080); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); context.addServlet(org.eclipse.jetty.servlet.DefaultServlet.class, "/"); context.addFilter(AppFilter.class, "/*", EnumSet.of(DispatcherType.INCLUDE,DispatcherType.REQUEST)); server.setHandler(context); server.start(); server.join(); 

我的docker版本是8.1.14.v20131031

ServletContextHandler.addFilter(...)方法只是ServletHandler.addFilter(...)方法的便捷包装器。 如果您只需要一个那么它们非常方便。 但是,如果您需要多个模式或选择使用 ,则需要更多类似的东西:

 ServletContextHandler context = new ServletContextHandler( ServletContextHandler.SESSIONS); FilterMapping mapping = new FilterMapping(); mapping.setFilterName( "Foobar Filter" ); mapping.setPathSpecs( new String[] { "/foo/*", "/bar/*" } ); mapping.setServletNames( new String[] { "foobar" } ); mapping.setDispatcherTypes( EnumSet.of( DispatcherType.INCLUDE,DispatcherType.REQUEST ) ) ); FilterHolder holder = new FilterHolder( FoobarFilter.class ); holder.setName( "Foobar Filter" ); context .getServletHandler().addFilter( holder, mapping );