Мне нужно перехватить все запросы, когда настроено несколько ServletContextHandler.
У меня есть несколько ServletContextHandler
в ContextHandlerCollection
и ContainerRequestFilter
.Мне нужно, чтобы это ContainerRequestFilter
было добавлено ко всем ServletContextHandler
Единственный способ найти ContainerRequestFilter
был через ResourceConfig
.Поэтому я сделал это:
ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.register(MyContainerRequestFilter.class);
ServletHolder s = new ServletHolder(new ServletContainer(resourceConfig));
for (Handler context : contextHandlers) {
((ServletContextHandler)context).addServlet(s, "/*");
}
, в результате чего:
java.lang.IllegalStateException: несколько сервлетов отображаются на путь: / *: org.eclipse.jetty.proxy.ProxyServlet $ Transparent-56c0a61e
Какой правильный способ сделать это?
Я также изучил обработчики и попытался следовать, но он переопределяет все другие сервлеты, содержащиеся в ContextHandlerCollection
, т.е., когда я вызываю / api (существует в одном из ServletContextHandler
в ContextHandlerCollection
), я получаю 404 из-за context.setContextPath("/");
ниже, но тогда этот фильтр запросов должен быть применен к базовому пути в любом случае.
HandlerWrapper wrapper = new HandlerWrapper();
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath("/");
ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.register(RequestInterceptor.class);
context.addServlet(new ServletHolder(new ServletContainer(resourceConfig)), "/*");
wrapper.setHandler(context)
HandlerCollection handlers = new HandlerCollection(true);
handlers.setHandlers(new Handler[]{wrapper,contexts});
Я также пытался добавить фильтр в коллекцию выше:
HandlerWrapper wrapper = new HandlerWrapper();
FilterHolder filter = new FilterHolder(MyContainerRequestFilter.class); // had to implment filter interface
wrapper.addFilterWithMapping(filter, "/*", EnumSet.allOf(DispatcherType.class)) ;
HandlerCollection handlers = new HandlerCollection(true);
handlers.setHandlers(new Handler[]{contexts,wrapper});
В этом случае запрос поступает в фильтр, но я получаю следующее исключение:
Не удалось отправить ответошибка 500: java.lang.IllegalStateException: совершено зафиксировано до 404 null