0

我正在使用 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 本身)?

4

0 回答 0