2010-09-07 14 views
6

Potrebbe aiutare a controllare perché doFilter non sempre chiamatodoFilter non sempre chiamato

web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
<context-param> 
<param-name>log4jConfigLocation</param-name> 
<param-value>/WEB-INF/log4j.properties</param-value> 
</context-param> 
<listener> 
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
</listener> 
<filter> 
<filter-name>roseFilter</filter-name> 
<filter-class>net.paoding.rose.RoseFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>roseFilter</filter-name> 
<url-pattern>/*</url-pattern> 
<dispatcher>REQUEST</dispatcher> 
<dispatcher>FORWARD</dispatcher> 
<dispatcher>INCLUDE</dispatcher> 
</filter-mapping> 
</web-app> 

firma classe:

import org.springframework.web.filter.GenericFilterBean; 
public class RoseFilter extends GenericFilterBean { 

404 viene restituito, mentre chiamata http://localhost:8080/hello/world, ho imposta i punti di interruzione su doFilter, sembra che doFilter non abbia chiamato? (Ho provato tomcat 6.0.18, 6.0.29, jdk1.6)

+1

La risoluzione '/ hello/world' è una risorsa per il server? In caso contrario, non vi è alcun motivo per avviare una catena di filtri. – rsp

+2

Sono abbastanza sicuro di averlo già visto prima, con lo schema '/ *' non funzionante. Non penso di averlo mai risolto. – skaffman

+0

@rsp: la risorsa non deve necessariamente essere una risorsa fisica esistente. Il filtro (e il servlet) mappati su '/ *' saranno invocati comunque. Potrebbe agire come un front controller. – BalusC

risposta

21

Il filtro non viene invocato quando:

  1. classe Il filtro è mancante nel percorso di classe e/o non caricabile o istanziabile. Dovresti comunque averlo notato nei log di avvio del server. La soluzione deve essere trovata sulla base dell'interpretazione delle eccezioni/errori trovati nei log del server.

  2. C'è un altro filtro in esecuzione prima della catena che non sta chiamando FilterChain#doFilter(), ma piuttosto RequestDispatcher#forward() o include() che ha causato i filtri successivi nella catena essere completamente saltato (quando non ascolto su FORWARD o INCLUDE spedizionieri, ma da l'impostazione predefinita è disponibile solo per il dispatcher REQUEST). La soluzione è quella di correggere il filtro sbagliato o di aggiungere <dispatcher>FORWARD</dispatcher> di conseguenza o di riorganizzare le dichiarazioni del filtro in web.xml in modo che il nuovo filtro venga prima dello un altro filtro (a sua volta è necessario solo assicurarsi che il nuovo filtro stia utilizzando il FilterChain#doFilter() correttamente :)).

  3. L'URL della richiesta è errato. Hai usato http://localhost:8080/hello/world. Con un filtro in ascolto su /*, ciò significa che il contesto webapp deve essere ROOT o almeno /hello. Verifica il tuo contesto webapp. Mi piacerebbe solo riprovare con un URL che punta a un JSP/servlet valido all'interno della stessa webapp che genera una risposta non 404. Viene quindi chiamato anche il filtro?

+0

1. La classe filtro è buona poiché initFilterBean è chiamato correttamente. –

+0

2. Ho aggiornato web.xml, per favore controlla. –

+0

Controllo l'API destroy(): questo metodo viene chiamato solo quando tutti i thread nel metodo doFilter del filtro sono usciti o dopo che è trascorso un periodo di timeout. Forse è il timeout? –

0

Com'è la richiesta web? Puoi provare a cambiare il tuo modello di URL in * .jsp invece di/*? Se stai usando qualcosa di diverso dal puro JSP, cambialo in qualunque sia l'estensione finale richiesta (come per i montanti, di solito è * .do).

Problemi correlati