Jetty如何将Servlet添加到多个ServletContextHandler或将ContainerRequestFilter应用于ContextHandlerCollection

时间:2018-11-15 04:54:30

标签: java jersey jetty embedded-jetty

当配置了多个ServletContextHandler时,我需要拦截所有请求。

我在ServletContextHandlerContextHandlerCollection中有多个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:多个servlet映射到路径:/ *:   org.eclipse.jetty.proxy.ProxyServlet $ Transparent-56c0a61e

正确的方法是什么?

我也研究了处理程序并尝试遵循,但是它覆盖了ContextHandlerCollection中包含的所有其他servlet,即,当我调用/ api(存在于ServletContextHandler中的ContextHandlerCollection中) ,由于下面的context.setContextPath("/");,我得到404,但是无论如何,此请求过滤器仍然需要应用于基本路径。

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前为空

1 个答案:

答案 0 :(得分:0)

我无法使用ContainerRequestFilter来做到这一点,但是我不得不使用javax.servlet.Filter

在我的情况下(多个ServletContextHandler)添加javax.servlet.Filter的正确方法是:

Handler[] contextHandlers = contexts.getHandlers();

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