首页 文章

如何使用嵌入式jetty添加servlet过滤器

提问于
浏览
21

我正在将jetty嵌入到我的应用程序中,并试图找出如何添加servlet过滤器(用于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()), "/");

我发现的唯一信息是forum post suggesting the documentation,这需要改进 .

3 回答

  • 24

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

    原始答案===

    如果您不想使用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根路径中包含以下xml的WEB-INF / web.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>
    
  • 24

    我遇到了同样的问题,但我认为Κα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();
    

    我的码头版本是 8.1.14.v20131031 .

  • 2

    ServletContextHandler.addFilter(...) 方法只是 ServletHandler.addFilter(...) 方法的便利包装器 . 如果您只需要一个 <url-pattern> ,那么它们非常方便 . 但是,如果您需要多个模式或选择使用 <servlet-name> ,则需要更多类似的内容:

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

相关问题