servlet prácticos mundo hola ejemplos ejemplo con java jetty servlet-filters embedded-jetty

java - prácticos - Cómo agregar el filtro servlet con embarcadero incrustado



servlet java (3)

Actualización: Para Jetty versión 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); }

Respuesta original ===

Si no quieres usar web.xml, usa esto:

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

Si desea usar web.xml, en lugar de los métodos addFilter (), simplemente asegúrese de tener un WEB-INF / web.xml en la ruta raíz de su aplicación web con el siguiente 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>

Estoy incorporando Jetty en mi aplicación, y estoy tratando de averiguar cómo agregar filtros de servlet (para el manejo de cookies) El wiki y el javadoc no lo dejan muy claro, ¿qué me falta?

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

La única información que he encontrado en esto es una publicación del foro que sugiere que la documentación sobre esto necesita ser mejorada.


Los métodos ServletContextHandler.addFilter(...) son simplemente envoltorios de conveniencia alrededor de los ServletHandler.addFilter(...) . Siempre que solo necesite un <url-pattern> es muy conveniente. Sin embargo, si necesita más de un patrón o elige utilizar <servlet-name> , necesitará algo más como esto:

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


Tengo el mismo problema, pero creo que la respuesta de Καrτhικ es demasiado compleja. Encontré esta manera fácil:

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

Mi versión de embarcadero es 8.1.14.v20131031 .