2015-10-20 4 views
1

Вот как настроить мой Jetty сервер:Как добавить фильтр регистрации заявок в Jetty 8?

Server server = new Server(80); 
server.setStopAtShutdown(true); 

ServletHandler servletHandler = new ServletHandler(); 
servletHandler.addServletWithMapping(Erreur500Servlet.class, "/generate-error-500"); 
servletHandler.addServletWithMapping(AresServlet.class, "/ares/*"); 
servletHandler.addFilterWithMapping(RequestLoggingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); 

server.setHandler(servletHandler); 
server.start(); // at com.company.MyPoc.init(MyPoc.java:44) 
server.join(); 

Однако, когда она начинается, я получил следующее исключение:

2015-10-20 12:53:07,565 (?:?) [WARN] FAILED com.company.filter.RequestLoggingFilter-896472140: java.lang.NullPointerException 
java.lang.NullPointerException: null 
    at org.eclipse.jetty.servlet.FilterHolder.doStart(FilterHolder.java:100) ~[jetty-servlet-8.0.1.v20110908.jar:8.0.1.v20110908] 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) [jetty-util-8.0.1.v20110908.jar:8.0.1.v20110908] 
    at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:753) [jetty-servlet-8.0.1.v20110908.jar:8.0.1.v20110908] 
    at org.eclipse.jetty.servlet.ServletHandler.doStart(ServletHandler.java:183) [jetty-servlet-8.0.1.v20110908.jar:8.0.1.v20110908] 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) [jetty-util-8.0.1.v20110908.jar:8.0.1.v20110908] 
    at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:89) [jetty-server-8.0.1.v20110908.jar:8.0.1.v20110908] 
    at org.eclipse.jetty.server.Server.doStart(Server.java:262) [jetty-server-8.0.1.v20110908.jar:8.0.1.v20110908] 
    at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:59) [jetty-util-8.0.1.v20110908.jar:8.0.1.v20110908] 
    at com.company.MyPoc.init(MyPoc.java:44) 

Что мне не хватает?

Jetty 8.0.1.v20110908

ответ

1

Вот решение, которое я придумал:

Server server = new Server(80); 
server.setStopAtShutdown(true); 

ServletContextHandler context = new ServletContextHandler(); 
context.addServlet(Erreur500Servlet.class, "/generate-error-500"); 
context.addServlet(AresServlet.class, "/ares/*"); 
context.addFilter(RequestLoggingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); 

server.setHandler(context); 
server.start(); 
server.join(); 
+0

Не используйте '.Add * WithMapping()' методы, используйте обычные 'addServlet()' и '.addFilter()' методы для обеспечения совместимости в будущем. –

+1

Не забывайте '.addServlet (DefaultServlet.class,"/")' иначе вы не получите статическую обработку содержимого, обработку ошибок или функциональность диспетчера. –

2

Во-первых, и самое главное, Jetty 8 is EOL (End of Life).

Далее, пожалуйста, используйте более новую версию Jetty, Jetty 8.0.1 (в настоящее время) содержит около 110 выпусков за текущей стабильной версией Jetty.

Теперь, чтобы объяснить, что происходит.

Вы используете ServletHandler напрямую, это внутренний класс, который не предназначен для создания и доступа непосредственно, но в самых простых и наивных ситуациях. А именно сервер с ровно 1 (и только 1) сервлетом, без фильтров, без безопасности, без обработки сеанса и т. Д.

Используйте ServletContextHandler и добавьте к нему свои сервлеты и фильтры. Это правильный способ, так как он устанавливает ServletContext, что все связанные с ним сервлеты и фильтры используют для координации.

Пример (это сделано из памяти, так как Jetty 8.0.1 настолько стар, это, возможно, потребуется некоторые настройки, чтобы работать должным образом на вашей древней версии Jetty):

Server server = new Server(8080); 
ServletContextHandler context = new ServletContextHandler(); 
context.setContextPath("/"); 
context.setResourceBase("/path/to/my/static/resources/"); 
context.setHandler(server); 

context.addServlet(Erreur500Servlet.class, "/generate-error-500"); 
context.addServlet(AresServlet.class, "/ares/*"); 
context.addFilter(RequestLoggingFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST)); 
context.addServlet(DefaultServlet.class, "/"); 

server.start(); 
server.join(); 

отметить:

  • Если у вас есть статические ресурсы для обслуживания (HTML, JavaScript, CSS, изображения, и т.д ..), а затем установить путь базового ресурса с .setResourceBase(String) (новый, и лучше, .setBaseResource(Resource) был добавлен в Jetty 9)
  • Если вы хотите, чтобы служить статические ресурсы или получить обработку ошибок не забудьте позвонить context.addServlet(DefaultServlet.class, "/")

Если вы хотите пользовательской обработки ошибок, используйте ServletContextHandler ErrorHandler особенности, как этот

// Default error handler 
ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler(); 
errorHandler.addErrorPage(500,"/error"); 

// Your webapp 
ServletContextHandler context = new ServletContextHandler(); 
context.setErrorHandler(errorHandler); 
context.addServlet(MyCustomErrorServlet.class, "/error"); 
// etc ... 

Следует также отметить , Jetty поставляется с RequestLogHandler, который выполняет ту же конечную цель (но использует обработчик Jetty, а не через фильтр).