私は自分のアプリに突堤を埋め込み、サーブレットフィルターを追加する方法を考えています(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()), "/");
私がこれについて見つけた唯一の情報は、 ドキュメントを提案するフォーラム投稿 これに関する改善が必要です。
更新: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();
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>
私も同じ問題を抱えていましたが、Κα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
。
ServletContextHandler.addFilter(...)
メソッドは、ServletHandler.addFilter(...)
メソッドの単なる便利なラッパーです。必要なのは1つの<url-pattern>
彼らare非常に便利です。ただし、複数のパターンが必要な場合、または<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 );