2013-01-18 13 views
20

Umieszczam pomost w mojej aplikacji i próbuję ustalić, jak dodać filtry serwletów (do obsługi ciasteczek). Wiki i dont Javadoc jest bardzo jasno, co mi brakuje:Jak dodać filtr serwletów z wbudowanym pomostem

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

Jedynym informacji znalazłem na to forum post suggesting the documentation na ten musi ulec poprawie.

+0

Czy istnieje powód, dla którego nie można określić go w pliku web.xml. Rozumiem, że jest to osadzone, ale tak długo, jak masz plik w ścieżce klas pod WEB-INF/web.xml, powinieneś być w porządku. –

+6

Nie używam web.xml przez długi czas, zwykle używam tylko adnotacji specyfikacji serwletu 3.0. Po prostu nie lubię marnować plików XML. – Jacob

Odpowiedz

23

Aktualizacja: Na Jetty wersja 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); 
    } 

odpowiedź Original ===

Jeśli nie chcesz korzystać z web.xml następnie użyj:

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

Jeśli chcesz używać web.xml, zamiast metod addFilter(), upewnij się, że masz WEB-INF/web.xml w ścieżce głównej webapp z następującym 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> 
+0

Dzięki. Co oznacza 1 w "webapp.addFilter (MyFilter.class,"/test ", 1)'. W moim kodzie właśnie to zignorowałem i przekazałem NULL, który wydaje się również działać. – Jacob

+0

Parametrem o wartości 1 jest liczba instancji uruchamianych podczas uruchamiania. –

+0

jak zrozumiałem molo 9.1.3, ostatnim parametrem jest EnumSet : zadeklarowany w ServletContextHandler public FilterHolder addFilter (Klasa filterClass, String ścieżkaSpec, EnumSet depesze) –

23

Mam ten sam problem, ale myślę, że odpowiedź Καττικ jest zbyt złożona. Znalazłem tę prostą metodę:

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

Moja wersja pomostu to 8.1.14.v20131031.

+3

tak, druga odpowiedź ma wiele nieistotnych rzeczy dla właściwego pytania. – Renato

2

Metody ServletContextHandler.addFilter(...) to po prostu opakowania typu convenience po metodach ServletHandler.addFilter(...). Pod warunkiem, że potrzebujesz tylko jednego <url-pattern>, są one bardzo wygodne. Jednak, jeśli potrzebujesz więcej niż jeden wzór lub zdecydować się na stosowanie <servlet-name> zamiast tego trzeba czegoś więcej tak:

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