How to add servlet Filter with embedded jetty

后端 未结 3 1948
清歌不尽
清歌不尽 2020-12-14 16:26

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 mis

3条回答
  •  [愿得一人]
    2020-12-14 17:10

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

    
    
    
    
    
        
            filterName
            com.x.y.z.FilterClass
        
        
            /test
            filterName
        
    
    

提交回复
热议问题