2012-06-01 7 views
7

Oto web.xml robocze:Korzystanie Tomcat, @WebFilter nie działa <Filtr-mapping> wewnątrz 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> 

Kiedy usunąć <filter> elementy i używać następujących adnotacji zamiast:

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

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

Potem Tomcat 7.0.14 daje mi następujący błąd:

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

śledziłem odpowiedź this question, ale to nie działa dla mnie.

Oto zależności mojej aplikacji internetowej:

<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: Mam tylko problem przy korzystaniu Tomcat (7.0.14). Glassfish jest w porządku.

+0

Czy możesz wypróbować najnowszą wersję Tomcat 7? Obecna wersja to 7.0.27. –

+0

Zrobiłem to, ten sam problem. ;) – AndrewBourgeois

Odpowiedz

11

Jest to błąd w Tomcat 7. Zgłosiłem to jako 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 

W międzyczasie najlepiej jest używać GlassFish lub JBoss AS zamiast lub zarejestrować filtrów <filter> tak.

+0

Używam elementów , ponieważ robię to dla własnego uczenia się. Dlaczego właśnie ten problem został już tylko zdemaskowany? Servlet 3.0 był już od jakiegoś czasu niedostępny, Tomcat 7, a to jest bardzo podstawowa funkcja ... (dopiero zacząłem uczyć się serwletów). Czy ludzie porzucili filtry na coś innego lub ...? – AndrewBourgeois

+0

Brak pomysłu. Może dlatego, że ludzie nie byli tego świadomi. A może dlatego, że zamówienie nie miało dla nich znaczenia. A może dlatego, że nie używają Tomcata do swoich mniejszych aplikacji z wieloma filtrami, dla których liczy się porządek. A może dlatego, że nie uważali za warte wysiłku raportowania. Itd. Kto wie. – BalusC

+2

FYI: został [naprawiony] (https://issues.apache.org/bugzilla/show_bug.cgi?id=53354#c1) autor [Mark] (http://stackoverflow.com/users/1299005/mark- Thomas) kilka sekund temu. Będzie w wersji 7.0.28 i nowszych. – BalusC

2

Musisz określić cel dla filtra serwletów. Podaj wartość dla "servletNames" lub "urlPatterns".

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

np

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

Usuwam tylko elementy z mojego web.xml, a nie z elementów . Jak odpowiedział w poniższym pytaniu, powinno działać: http://stackoverflow.com/questions/6560969/how-to-define-servlet-filter-order-of-execution-using-annotations. Działa tylko wtedy, gdy wdrażam go w środowisku Glassfish. – AndrewBourgeois

Powiązane problemy