# doFilter wird zwei mal aufgerufen



## freez (26. Sep 2007)

Hallo,

ich habe eine Anwendung, in der ich einen Filter implementiert habe. Wenn ich auf einen commandLink klicke, dann wird die Methode 
	
	
	
	





```
public void doFilter(ServletRequest requ, ServletResponse resp, 
         FilterChain chain) throws IOException, ServletException {
```

zwei mal aufgerufen. Die erste ServletRequest.getRequestURL() ist dann die Seite, von der ich komme, und die zweite ist die, welche ich erreichen will.

Die commandLinks sind so implementiert:
	
	
	
	





```
<h:commandLink action="to_celllist" styleClass="searchText">
						<h:outputText value="Zellen" styleClass="searchText"/>
					</h:commandLink>
```


in der faces-config.xml sind die navigation_rules auf die festen Texte hinterlegt, welche im action Attribut hinterlegt sind.

Die Navigation funktioniert hervorragend, nur die Methode doFilter wird 2 mal aufgerufen. Warum?


----------



## HLX (26. Sep 2007)

Bist du sicher, dass die Methode 2x aufgerufen wird, oder befindest du dich lediglich 2x im gleichen Filter?

Letzteres wäre o.k. da Filter ineinander geschachtelt werden. Auch das Servlet wird "geschachtelt"

Nach dem letzen Filter wird im Filter mittels "chain.doFilter(request, response)" das Servlet aufgerufen. Deine eigene "doFilter"-Methode kann davor und danach Anweisungen enthalten. Die Anweisungen davor werden vor- die anderen nach Abarbeitung des Servlets ausgeführt.

Sollte allerdings die Filtermethode tatsächlich 2x aufgerufen werden, wären Informationen über Filterkonfiguration und Inhalt deiner "doFilter"-Methode hilfreich.


----------



## Ralf Ueberfuhr (27. Sep 2007)

Filter werden u.a. auch beim Forward von Servlet A zu B aktiv, je nachdem, was du im Web-DD eingestellt hast.


----------



## freez (30. Sep 2007)

Meine web.xml sieht so aus:

```
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>/WEB-INF/faces-config.xml</param-value>
  </context-param>
  <listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <filter-class>org.apache.myfaces.component.html.util.ExtensionsFilter</filter-class>
    <init-param>
      <param-name>maxFileSize</param-name>
      <param-value>20m</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <url-pattern>*.jsf</url-pattern>
  </filter-mapping>
  
  <resource-ref>
        <description>
            Ressource-Reference zu einer Factory, die java.sql.Connection Instanzen erzeugen kann. Diese können (müssen) in der server.xml eingerichtet werden.
        </description>
        <res-ref-name>
            jdbc/cells
        </res-ref-name>
        <res-type>
            javax.sql.DataSource
        </res-type>
        <res-auth>
            Container
        </res-auth>
    </resource-ref>
  <welcome-file-list>
  <welcome-file>index.jsf</welcome-file>
  <welcome-file>default.jsf</welcome-file>
</welcome-file-list>

<filter> 
<filter-name>navigationFilter</filter-name> 
<filter-class>com.test.navigationFilter</filter-class> 
</filter> 

<filter-mapping> 
<filter-name>navigationFilter</filter-name> 
<url-pattern>*.jsf</url-pattern> 
</filter-mapping> 

</web-app>
```

und meine filtermethode ist diese da: www.java-forum.org/de/topic55647_jsf-outputlink-zur-ck.html


----------



## Ralf Ueberfuhr (30. Sep 2007)

Und wenn du nun willst, dass dein Filter nicht bei internen Forwards aktiv wird, dann ändere das im Filter-Mapping, wie in diesem Beispiel:


```
<filter-mapping>
		<filter-name>ResponseOverrideFilter</filter-name>
		<url-pattern>*.do</url-pattern>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>
```

Du kannst mehrere <dispatcher>-Objekte einfügen, möglich sind noch INCLUDE, FORWARD und ERROR für alle möglichen Ereignisse, eine Ressource aufzurufen.


----------



## freez (1. Okt 2007)

super ... das hat geholfen ... danke


----------

