Wenn man einen ServletFilter für die eigene Webapp baut, dann muss man drei Methoden des Interfaces implementieren: init()
, doFilter()
und destroy()
. Der Filter wird danach in die web.xml
aufgenommen und startet zusammen mit der Webapp, wobei beim Starten des Filters seine init()
-Methode aufgerufen wird.
So weit die Theorie. Spring ermöglicht es, Filter im ApplicationContext
zu definieren und ihnen damit Zugriff auf andere Beans zu bieten. Über die Namenskonvention Filtername == BeanId wird nun nicht mehr die Filterklasse in der web.xml
eingetragen, sondern eine Klasse aus Spring:
<filter>
<filter-name>beispielFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>beispielFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Ärgerlicherweise führt diese per Default nicht die init()
– und destroy()
-Methoden aus. Im JavaDoc findet sich der entscheidende Hinweise: Ein init-Parameter muss in der web.xml
gesetzt werden, damit der Filter-Lifecycle durchgeführt wird. Dies sieht am Ende so aus:
<filter>
<filter-name>beispielFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>