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

7

Вот рабочий 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). Стеклянная рыба в порядке.

Можете ли вы попробовать последнюю версию Tomcat 7? Текущая версия 7.0.27. Christopher Schultz
Я сделал то же самое. ;) AndrewBourgeois

Ваш Ответ

2   ответа
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
Я удаляю только элементы <filter> из моего web.xml, но не элементы <filter-mapping>. Как ответили в следующем вопросе, это должно работать: / Stackoverflow.com вопросы / 6560969 / .... Он работает только при развертывании в среде Glassfish. AndrewBourgeois
11

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> так или иначе

Ты их напугал! Спасибо за продолжение, я обязательно проверю это, когда они выпустят его. AndrewBourgeois
Я в порядке с использованием элементов <filter>, поскольку я делаю это для собственного обучения. Почему эта проблема была решена только сейчас? Servlet 3.0 был выпущен некоторое время, Tomcat 7 тоже, и это очень простая функция ... (я только начал изучать сервлеты). Люди отказались от фильтров ради чего-то еще или ...? AndrewBourgeois
Без понятия. Возможно, потому что люди не знали об этом. Или, может быть, потому что заказ не имеет значения для них. Или, может быть, потому что они не использовали Tomcat для своих небольших веб-приложений с несколькими фильтрами, для которых важен порядок. Или, может быть, потому, что они не сочли нужным сообщить о своих усилиях И т.д. Кто знает. BalusC
FYI: былисправлен поОтметк несколько секунд назад. Будет в 7.0.28 и далее. BalusC
@ BalusC это было исправлено в Tomcat 8? Dejell

Похожие вопросы