使用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