servlet example dofilter java java-ee tomcat servlet-filters

java - dofilter - servlet security filter example



Con Tomcat, @WebFilter no funciona con<filter-mapping> dentro de web.xml (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

p.ej

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

Aquí hay un web.xml que funciona:

<?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 elimino los elementos <filter> y uso las siguientes anotaciones:

@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 a esta pregunta , 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>

EDITAR: solo tengo el problema cuando uso Tomcat (7.0.14). Glassfish está bien.


Es un error en Tomcat 7. Lo reporté como problema 53354 .

Como no es posible especificar el orden de invocación en @WebFilter , los usuarios están obligados a especificar explícitamente <filter-mapping> en web.xml. Esto funciona en combinación con @WebFilter(filterName) en Glassfish y JBoss AS de la siguiente manera:

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

con

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

Sin embargo, falla en Tomcat 7.0.27 con la siguiente excepción confusa ( se ha establecido el <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

Mientras tanto, lo mejor es usar Glassfish o JBoss AS en su lugar, o registrar los filtros por <filter> todos modos.