Используя Tomcat, @WebFilter не работает с <filter-mapping> внутри web.xml

Вот рабочий web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

     <filter>
        <filter-name>rememberMeCookieFilter</filter-name>
        <filter-class>be.example.fun.jsp.filters.RememberMeCookieFilter</filter-class>
    </filter>

    <filter>
        <filter-name>mustBeSignedInFilter</filter-name>
        <filter-class>be.example.fun.jsp.filters.MustBeSignedInFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>rememberMeCookieFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>mustBeSignedInFilter</filter-name>
        <url-pattern>/private/*</url-pattern>
    </filter-mapping>
</web-app>

Когда я удаляю<filter> элементы и использовать следующие аннотации вместо:

@WebFilter(filterName="rememberMeCookieFilter")
public class RememberMeCookieFilter implements Filter

@WebFilter(filterName="mustBeSignedInFilter")
public class MustBeSignedInFilter implements Filter

Тогда Tomcat 7.0.14 выдает мне следующую ошибку:

java.lang.IllegalArgumentException: Filter mapping must specify either a <url-pattern> or a <servlet-name>
    at org.apache.catalina.core.StandardContext.validateFilterMap(StandardContext.java:2956)
    at org.apache.catalina.core.StandardContext.addFilterMap(StandardContext.java:2915)
    at org.apache.catalina.deploy.WebXml.configureContext(WebXml.java:1180)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1270)
        ...

Я следовал за ответомэтот вопрос, но это не работает для меня.

Вот зависимости моего веб-приложения:

<dependencies>
        <!-- SLF4J (+ LOGBack) for logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>1.8.3</version>
        </dependency>

        <!-- The servlet API that I installed in my local repo -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>3.0</version>
            <type>jar</type>
            <scope>provided</scope>
            <!--optional>false</optional-->
        </dependency>

        <!-- JUnit for testing -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

РЕДАКТИРОВАТЬ: у меня проблема только при использовании Tomcat (7.0.14). Стеклянная рыба в порядке.

 Christopher Schultz02 июн. 2012 г., 19:28
Можете ли вы попробовать последнюю версию Tomcat 7? Текущая версия 7.0.27.
 AndrewBourgeois02 июн. 2012 г., 22:37
Я сделал то же самое. ;)

Ответы на вопрос(2)

rvletNames» или «urlPatterns».

http: //docs.oracle.com/javaee/6/api/javax/servlet/annotation/WebFilter.htm

например

@WebFilter(filterName="mustBeSignedInFilter", urlPatterns={ "/signed/in/path/*" })
public class MustBeSignedInFilter implements Filter
 AndrewBourgeois03 июн. 2012 г., 20:18
Я удаляю только элементы <filter> из моего web.xml, но не элементы <filter-mapping>. Как ответили в следующем вопросе, это должно работать: / Stackoverflow.com вопросы / 6560969 / .... Он работает только при развертывании в среде Glassfish.
Решение Вопроса

issue 53354.

Поскольку невозможно указать порядок вызова в@WebFilter, пользователи вынуждены явно указывать<filter-mapping> в web.xml. Это работает в сочетании с@WebFilter(filterName) в Glassfish и JBoss AS следующим образом:

@WebFilter(filterName="filter1")
public class Filter1 implements Filter {}

@WebFilter(filterName="filter2")
public class Filter2 implements Filter {}

<filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/url1/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>filter2</filter-name>
    <url-pattern>/url2/*</url-pattern>
</filter-mapping>

Как бы то ни было, в Tomcat 7.0.27 произойдет сбой со следующим непонятным исключением <url-pattern> являетс было установлено)

Caused by: java.lang.IllegalArgumentException: Filter mapping must specify either a <url-pattern> or a <servlet-name>
    at org.apache.catalina.core.StandardContext.validateFilterMap(StandardContext.java:3009)
    at org.apache.catalina.core.StandardContext.addFilterMap(StandardContext.java:2968)
    at org.apache.catalina.deploy.WebXml.configureContext(WebXml.java:1207)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1294)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:855)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:345)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5161)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 7 more

В то же время, вам лучше всего использовать Glassfish или JBoss AS или зарегистрировать фильтры по<filter> так или иначе

 AndrewBourgeois03 июн. 2012 г., 23:27
Ты их напугал! Спасибо за продолжение, я обязательно проверю это, когда они выпустят его.
 AndrewBourgeois03 июн. 2012 г., 21:45
Я в порядке с использованием элементов <filter>, поскольку я делаю это для собственного обучения. Почему эта проблема была решена только сейчас? Servlet 3.0 был выпущен некоторое время, Tomcat 7 тоже, и это очень простая функция ... (я только начал изучать сервлеты). Люди отказались от фильтров ради чего-то еще или ...?
 BalusC03 июн. 2012 г., 22:53
Без понятия. Возможно, потому что люди не знали об этом. Или, может быть, потому что заказ не имеет значения для них. Или, может быть, потому что они не использовали Tomcat для своих небольших веб-приложений с несколькими фильтрами, для которых важен порядок. Или, может быть, потому, что они не сочли нужным сообщить о своих усилиях И т.д. Кто знает.
 BalusC03 июн. 2012 г., 23:19
FYI: былисправлен поОтметк несколько секунд назад. Будет в 7.0.28 и далее.
 Dejell18 февр. 2015 г., 14:03
@ BalusC это было исправлено в Tomcat 8?

Ваш ответ на вопрос