Как добавить фильтр регистрации запросов в Jetty 8?
Вот как я настраиваю свой сервер Jetty:
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)
Что мне не хватает?
Причал 8.0.1.v20110908
2 ответа
Вот решение, которое я придумал:
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();
Во-первых, и самое главное, Jetty 8 - это 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, images и т. Д.), Задайте путь к базовому ресурсу с помощью
.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 Handler, а не через фильтр).