Comment écrire la réponse du filtre?
Est-il un moyen de gérer seule réponse dans un filtre .
Est le code écrit ci-dessous est correcte ?
public void doFilter(request , response , chain) {
//code to handle request
chain.doFilter(request, response);
//code to handle response .
}
Vous devez vous connecter pour publier un commentaire.
Cela dépend de ce que vous voulez. En général, votre exemple n'est pas correct cependant. Après
chain.doFilter
a renvoyé, il est trop tard pour faire quoi que ce soit avec la réponse. À ce stade, toute la réponse a déjà été envoyé au client et votre code n'a pas accès à elle.Ce que vous devez faire est d'envelopper
request
et/ouresponse
dans vos propres classes, passer ces wrappers dansdoFilter
méthode et gérer n'importe quel traitement de votre demande.Pour le rendre plus facile, il y a déjà des wrappers disponibles dans la servlet api: voir
HttpServletRequestWrapper
etHttpServletResponseWrapper
classes. Si vous voulez processus de sortie qui est envoyé au client, vous avez également besoin d'écrire personnalisé OutputStream ou de l'Écrivain wrappers, et de renvoyer ceux de votre HttpServletResponse wrapper. Ouais, beaucoup de habillage 🙂Certains plus simples filtres peuvent travailler sans emballage de requête ou de réponse: par exemple, avant d'appeler
doFilter
, vous pouvez déjà accéder aux en-têtes de requête ou vous pouvez envoyer de réponse personnalisée sans appeldoFilter
. Mais si vous voulez processus du corps de la requête, vous ne pouvez pas le lire, sinon il ne sera pas disponible pour le reste de la chaîne. Dans ce cas, vous devez utiliser la technique de " wrapping de nouveau.Le code que vous montrez n'est pas tout à fait correcte, mais avec une nécessaire simplification de la terminologie - il. Vous pouvez "gérer" une demande, même après
chain.doFilter(..)
(et la réponse avant qu'il).Ce
chain.doFilter(..)
signifie que le processus est passé à la cible souhaitée, et quand le retour de la méthode, la cible a terminé sa sortie.Donc, pour être plus précis, c'est "avant" et "après" la demande a été traitée et une réponse générée.
Votre code semble aller pour le mieux.
Si vous ne voulez gérer la réponse, vous pouvez simplement mettre votre code dans le
//Code to handle response .
section et de faire ce que vous voulez.Si vous voulez faire quelque chose avec la sortie, vous devrez fournir une réponse particulière wrapper qui gère l'outputstream dans la réponse lorsque la servlet (et autres filtres) peut écrire à.
Demande et les Réponses sont en lecture seule.Donc ils n'ont pas de setter de modifier le contenu de ce.Mais à l'aide de la "HttpServletRequestWrapper et HttpServletResponseWrapper" les classes qui sont fournis construit en java, nous pouvons en modifier son contenu.Nous sommes l'encapsulation de l'original de la demande et de la réponse des objets par l'emballage des objets,par la modification de l'emballage des objets que l'on peut vraiment modifier l'original de la demande et de la réponse des objets.
J'ai filtré la réponse en utilisant ci-dessous de code :