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?
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.
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.
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.
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.
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.
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.