Как добавить сервлет в несколько ServletContextHandler или применить ContainerRequestFilter к ContextHandlerCollection - PullRequest
0 голосов
/ 15 ноября 2018

Мне нужно перехватить все запросы, когда настроено несколько 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

1 Ответ

0 голосов
/ 15 ноября 2018

Я не мог сделать это с ContainerRequestFilter, но мне пришлось использовать javax.servlet.Filter

И правильный способ добавить javax.servlet.Filter в моем случае (Multiple ServletContextHandler):

Handler[] contextHandlers = contexts.getHandlers();

for (Handler context : contextHandlers) {
        ((ServletContextHandler)context).addFilter(RequestInterceptor.class, "/*", 
EnumSet.allOf(DispatcherType.class));
}
...