web-dev-qa-db-fra.com

Que fait doFilter dans la méthode doFilter dans les filtres de java?

Je veux savoir que dans notre méthode dofilter j'ai fait cet appel chain.doFilter. Que fait doFilter dans un doFilter? Est-ce que ça ne va pas recevoir d'appel récursif?

36
giri

Les filtres de servlet sont une implémentation du modèle de conception Chaîne de responsabilité .

Tous les filtres sont chaînés (dans l'ordre de leur définition dans web.xml). La chain.doFilter() passe à l'élément suivant de la chaîne. Le dernier élément de la chaîne est la ressource/servlet cible.

52
Bozho

Il appelle la méthode doFilter de l'objet chain, pas lui-même, donc non, il ne sera pas récursif.

Le nom chain suggère que vous avez une séquence de filtres, chaque filtre effectuant un certain traitement et passant ensuite au suivant dans l'ordre, de sorte que chaque objet possède un membre chain pour pointer vers le suivant filtre dans la séquence, qui est appelée une fois que le filtre a effectué son propre traitement. Le dernier de la séquence aura alors probablement null comme valeur chain, ou il sait par lui-même que c'est le dernier de la séquence.

13
JaakkoK

En interne, il appelle doFilter du filtre suivant dans la chaîne de filtres et, lorsque la chaîne est terminée, il appelle la servlet cible.

2
axtavt

Provoque l'appel du filtre suivant de la chaîne ou, si le filtre appelant est le dernier filtre de la chaîne, provoque l'appel de la ressource à la fin de la chaîne.

1
Vivek Parashar

En appelant chain.doFilter, vous transférez la demande/réponse au filtre suivant de votre chaîne de filtrage. Si vous ne l'appelez pas, le filtre suivant (probablement défini dans votre web.xml) ne sera pas exécuté.

Si vous venez d'appeler doFilter, alors oui, vous auriez une récursivité sans fin et un stackoverflow. Cependant, vous appelez la méthode doFilter de l'objet filterChain, qui lui demande d'exécuter le filtre suivant.

1
Kallin Nagelberg

N'ayant pas de code dont vous parlez, je peux seulement supposer que vous quelque chose comme:

class Filter implements FilterAPI {
  private FilterAPI chain;
  FilterAPI(FilterAPI chain) { this.chain = chain; }
  @override void doFilter (Set setToFilter) {
    // do some filtering on setToFilter
    chain.doFilter(setToFilter);
  }
}

Si tel est le cas, vous n'appelez rien de manière récursive, vous appelez doFilter () sur un autre objet. Comme mentionné dans une autre réponse, il s'agit du modèle de conception de chaîne de responsabilité bien connu.

1
Paul Wagland