2013-01-18 14 views
20

私はjettyを私のアプリケーションに埋め込み、サーブレットフィルタ(クッキーの処理用)を追加する方法を工夫しています。ウィキとのjavadocのはいけない、それは非常に明確にし、私が何をしないのです:servletを追加する方法jettyが埋め込まれたフィルタ

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では改善する必要があります。

+0

あなたはweb.xmlファイル内に定義することはできません理由があります。私はこれが組み込まれていることを認識していますが、WEB-INF/web.xmlの下のクラスパスにファイルがある限り、上手くいくはずです。 –

+6

私は長い間web.xmlを使用していませんが、通常はサーブレット3.0の仕様アノテーションを使用しています。私はちょうどXMLファイルでうんざりして楽しんでいない。 – Jacob

答えて

23

更新:桟橋バージョン9.2.2の場合:

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

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を使用しない場合

addFilter()メソッドの代わりにweb.xmlを使用する場合は、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> 
+0

ありがとうございます。 1は 'webapp.addFilter(MyFilter.class、"/test "、1)'の意味です。私のコードでは、私はそれを無視してNULLで渡しました。これもうまくいくようです。 – Jacob

+0

値が1のパラメータは、起動時に起動するインスタンスの数です。 –

+0

私がjetty 9.1.3を理解したように、最後のパラメータはEnumSet です。ServletContextHandlerで宣言されています public FilterHolder addFilter(Class <?extends Filter> filterClass、String pathSpec、EnumSet dispatches) –

23

私は同じ問題を抱えていますが、私はΚα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です。

+3

うん、もう一つの答えは、実際の質問には無関係なものがたくさんあります。 – Renato

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); 
関連する問題