2012-06-01 13 views
7

He aquí un web.xml de trabajo:El uso de Tomcat, @WebFilter no funciona con <filter-mapping> dentro 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> 

Cuando quito los <filter> elementos y el uso de las siguientes anotaciones en su lugar:

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

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

Entonces Tomcat 7.0.14 me da el siguiente error:

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) 
     ... 

seguí la respuesta de this question, pero eso no funciona para mí.

Aquí están las dependencias de mi aplicación web:

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

EDIT: sólo tengo el problema cuando se utiliza Tomcat (7.0.14). Glassfish está bien.

+0

¿Puedes probar con una versión actualizada de Tomcat 7? La versión actual es 7.0.27. –

+0

Lo hice, el mismo problema. ;) – AndrewBourgeois

Respuesta

11

Es un error en Tomcat 7. Me dicen que como issue 53354.

As it's not possible to specify the invocation order in a @WebFilter , users are forced to explicitly specify <filter-mapping> in web.xml. This works in combination with a @WebFilter(filterName) in Glassfish and JBoss AS as follows:

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

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

with

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

However it fails in Tomcat 7.0.27 with the following confusing exception (the <url-pattern>is been set)

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 

En el mientras tanto la mejor opción es utilizar Glassfish o JBoss AS en su lugar, o para registrar los filtros por <filter> de todos modos.

+0

Estoy bien con el uso de elementos ya que estoy haciendo esto para mi propio aprendizaje. ¿Por qué es que este problema solo se descubrió ahora? Servlet 3.0 ha estado fuera por un tiempo, Tomcat 7 también, y esta es una característica muy básica ... (recién comencé a aprender servlets). ¿La gente abandonó Filters por otra cosa o ...? – AndrewBourgeois

+0

No tengo idea. Tal vez porque la gente no estaba al tanto de esto. O tal vez porque el orden no importaba para ellos. O tal vez porque no usaron Tomcat para sus webapps no tan pequeñas con filtros múltiples para los que el orden es importante. O tal vez porque no encontraron que valga la pena el esfuerzo de informar. Etc. Quién sabe. – BalusC

+2

FYI: ha sido [resuelto] (https://issues.apache.org/bugzilla/show_bug.cgi?id=53354#c1) por [Mark] (http://stackoverflow.com/users/1299005/mark- Thomas) hace algunos segundos. Estará en 7.0.28 en adelante. – BalusC

2

Debe especificar un objetivo para el filtro de servlet. Proporcione un valor para 'servletNames' o 'urlPatterns'.

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

por ejemplo

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

Solo estoy eliminando los elementos de mi web.xml, no los elementos . Tal como se respondió en la siguiente pregunta, debería funcionar: http://stackoverflow.com/questions/6560969/how-to-define-servlet-filter-order-of-execution-using-annotations. Solo funciona cuando lo despliego en un entorno Glassfish. – AndrewBourgeois

Cuestiones relacionadas