2009-08-24 5 views
20

L'objet javax.servlet.Filter peut être utilisé à la fois pour l'authentification (lorsque le filtre doit capturer la requête avant qu'un travail de servlet ne soit effectué) et pour la traduction XSLT (où le servlet doit être complètement terminé). Quand est-il réellement exécuté? Je sais que cela dépend de l'implémentation (sur le conteneur web), mais cela semble être un problème qui doit être résolu par tous.Est-ce que doFilter() est exécuté avant ou après le travail du servlet?

Peut-être qu'une option de configuration est définie quelque part pour chaque enregistrement de filtre avec le conteneur Web?

supplémentaires:

En outre, ce qui gouverne l'ordre d'exécution du filtre? Pourquoi FooFilter serait-il exécuté avant BarFilter?

+0

L'ordre d'exécution du filtre est pourrait être fourni dans le fichier web.xml en utilisant le . Le conteneur interceptera le flux de travail du programme avec les filtres fournis en commençant par le haut. –

Répondre

43

La chaîne de filtres enveloppe l'appel de servlet. La chaîne traitera tous les liens jusqu'à ce qu'elle atteigne le «bas», puis permettra au servlet de fonctionner, puis retournera la chaîne en sens inverse. Par exemple, si vous avez une nouvelle méthode « exemple de filtre », votre doFilter() peut ressembler à ceci:

public void doFilter(ServletRequest request, 
     ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
// do pre-servlet work here 
chain.doFilter(request, response); 
// do post servlet work here 

} 
+0

Cela peut être un peu artificiel, mais si je veux rejeter la réponse? En d'autres termes, je veux arrêter la réponse qui sort réellement? Est-ce là une exception ServletException? –

+1

Le lancement d'une exception ServletException retournerait toujours une "réponse" au client, cela dépendrait donc de ce que vous vouliez dire en ne renvoyant pas de réponse. Vous pouvez créer un nouvel objet de réponse, avec uniquement le contenu que vous spécifiez et le renvoyer si vous le souhaitez. –

+0

Ah bon point. Absolument aucune réponse n'est vraiment désirable. Même lorsque le retour de doFilter() avant d'appeler chain.doFilter(), il renvoie encore une autre page d'erreur ou quelque chose par défaut. –

0

@ Rich: Est-ce doFilter() exécuté avant ou après le travail du Servlet est fait?

Un filtre est un programme qui fonctionne sur le serveur avant la servlet ou JSP avec auquel il est associé.

+0

D'où cela vient-il? –

+0

Il semble provenir de "Plus Servlets et JavaServer Pages" par Marty Hall. –

+0

@adatapost car il encapsule l'invocation, il sera invoqué avant le servlet/jsp, mais reprendra le contrôle après son traitement (si un autre filtre n'a pas interrompu le traitement) –

7

alt text http://img228.imageshack.us/img228/8945/filter.png

A propos de l'ordre: que je me souviens du conteneur de servlets spécifications ne garantit pas que les filtres seront appelés dans un certain ordre.

+2

"Les filtres sont invoqués dans l'ordre dans lequel les mappages de filtres apparaissent Dans la liste de mappage de filtres d'un fichier WAR, vous spécifiez une liste de mappage de filtres pour un fichier WAR dans son descripteur de déploiement codant la liste à la main avec XML. "Référence: http://docs.oracle.com/javaee/6/tutorial/doc /bnagb.html –

+3

Votre lien image est cassé. – Bob

-1

Selon le filtre de spécification de servlet2.3 est effectuée selon la configuration web.xml de séquence de mise en correspondance filtre- Ref- http://www.programering.com/a/MTMyADOwATI.html

+0

Bien que cela puisse théoriquement répondre à la question, [il serait préférable] (// meta.stackoverflow.com/q/8259) d'inclure les parties essentielles de la réponse ici, et de fournir le lien pour référence. –

Questions connexes