我正在使用 Tomcat,但我想采用通用方式(servlet 3.0)
我在 web.xml 中有一些配置的过滤器,其中之一是 GuiceFilter。GuiceFilter 有点欺负人......一旦它被执行,它将吞下请求并且永远不会调用正在进行的过滤器。这样我就无法在 Guice 之后执行任何过滤器。我可以在 web.xml 的 guice insetead 中定义所有过滤器,但这不适用于某些过滤器:“Tomcat WebSocket (JSR356) Filter”这是一个过滤器 Tomcat 将在所有其他过滤器之后注册以处理 WebSockets...它应该是第一个,不是最后一个,但我只需要在 GuiceFilter 之前或在其中执行它。
我找到了一种获取所有已注册过滤器并将它们添加到 guice 的方法:
for (Entry<String, ? extends FilterRegistration> entry : context.getFilterRegistrations().entrySet()) {
FilterRegistration filterRegistration = entry.getValue();
System.out.println(entry.getKey() + " = " + filterRegistration);
Class<? extends Filter> clazz = (Class<? extends Filter>) Class.forName(filterRegistration.getClassName());
if (GuiceFilter.class.isAssignableFrom(clazz)) {
continue;
}
bind(clazz).in(Singleton.class);
filter(filterRegistration.getUrlPatternMappings()).through(clazz, filterRegistration.getInitParameters());
}
但这样我会得到一些过滤器(Guice 之前的一个)执行两次(普通过滤器链和 guice 一个)
有没有办法获得过滤器订单?(所以我只能在 guice 之后添加那些)
或者,另一种方式:有没有办法从正常链中删除过滤器,只留下 guice 一个(将所有其他过滤器移动到 guice 本身)?