使用Tomcat,@ WebFilter不能与web.xml中的一起使用

这是一个有效的web.xml:

   30   rememberMeCookieFilter be.example.fun.jsp.filters.RememberMeCookieFilter   mustBeSignedInFilter be.example.fun.jsp.filters.MustBeSignedInFilter   rememberMeCookieFilter /*   mustBeSignedInFilter /private/*   

当我删除元素并使用以下注释时:

 @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  or a  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) ... 

我按照这个问题的答案,但这对我不起作用。

以下是我的Web应用程序的依赖项:

    org.slf4j slf4j-api 1.6.4   ch.qos.logback logback-core 1.0.0   ch.qos.logback logback-classic 1.0.0   org.codehaus.groovy groovy 1.8.3    javax.servlet servlet-api 3.0 jar provided     junit junit 4.8.2 test   

编辑:我只使用Tomcat(7.0.14)时遇到问题。 Glassfish很好。

这是Tomcat 7中的一个错误。我将其报告为问题53354 。

由于无法在@WebFilter指定调用顺序,因此用户必须在web.xml中显式指定 。 这与Glassfish和JBoss AS中的@WebFilter(filterName)结合使用,如下所示:

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

  filter1 /url1/*   filter2 /url2/*  

但是它在Tomcat 7.0.27中失败并出现以下令人困惑的exception( 已设置)

 Caused by: java.lang.IllegalArgumentException: Filter mapping must specify either a  or a  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,或者通过注册过滤

您必须为Servletfilter指定目标。 为“servletNames”或“urlPatterns”提供值。

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

例如

 @WebFilter(filterName="mustBeSignedInFilter", urlPatterns={ "/signed/in/path/*" }) public class MustBeSignedInFilter implements Filter