Jetty如何将servlet添加到多个servlet上下文处理程序或将ContainerRequestFilter应用



当配置了多个Servlet上下文处理程序时,我需要拦截所有请求

我在ContextHandlerCollectionContainerRequestFilter中具有多个ServletContextHandler。我需要将此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.IollegalStateException:多个servlet映射到路径:/*:org.eclipse.jjetty.proxy.ProxyServlet$Transparent-5660a61e

这样做的正确方法是什么?

我还研究了处理程序并尝试了以下操作,但它覆盖了ContextHandlerCollection中包含的所有其他servlet,即,当我调用/api(存在于ContextHandlerCollection中的一个ServletContextHandler中(时,由于下面的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.IollegalStateException:404之前提交的已提交为空

我无法使用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));
}

最新更新