doFilter wird zwei mal aufgerufen

Status
Nicht offen für weitere Antworten.

freez

Top Contributor
Hallo,

ich habe eine Anwendung, in der ich einen Filter implementiert habe. Wenn ich auf einen commandLink klicke, dann wird die Methode
Code:
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:
Code:
<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?
 
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.
 
Meine web.xml sieht so aus:
Code:
<?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
 
Und wenn du nun willst, dass dein Filter nicht bei internen Forwards aktiv wird, dann ändere das im Filter-Mapping, wie in diesem Beispiel:

Code:
	<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.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben