在运行时获取过滤器顺序

时间:2016-08-26 12:45:31

标签: java tomcat servlet-filters servlet-3.0 guice-3

我使用Tomcat,但我想采用通用方式(servlet 3.0)

我在web.xml中有一些已配置的过滤器,其中一个是GuiceFilter。 GuiceFilter是一个有点欺负......一旦它被执行它将吞下请求并且永远不会调用进行过滤器。这样我就无法在Guice之后执行任何过滤器。 我可以在guice中定义所有过滤器而不是web.xml,但是这对于某些过滤器不起作用:" 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 one之前的过滤器)执行两次(普通过滤器链和guice一个)

有没有办法让滤镜订购? (所以我只能添加guice之后的那些)

或者,另一种方式:有没有办法从正常链中删除过滤器,只留下guice one(将所有其他过滤器移动到guice本身)?

0 个答案:

没有答案