0
votes

Springboot 2 - EntréeRequestFilter - Modifier les en-têtes de réponse après traitement du contrôleur

Bonjour Je veux modifier certaines des en-têtes de réponse de mes API après avoir terminé le traitement (logique exécutée) et avoir conclu avec un code d'état HTTP.

Par exemple, si la réponse est 404, inclure spécifique par exemple Cache-Control CODE> Exemple d'en-têtes Ne pas cache ou quelque chose comme ça. P>

J'ai déjà 2 autre code> enregistré, qui fonctionne bien - mais je ne peux évidemment pas faire la logique - une fois le traitement terminé. Le cachecontrolfilter code> a déjà une logique qui ajoute par défaut certains Cache-contrôle code> en-têtes - par exemple, cache pendant 15 secondes, etc. Il semble que cela se produise (l'ajout d'en-têtes sur la réponse ) Sur un stade très précoce de l'expédition et lorsqu'il atteint la phase d'exécution du contrôleur réel Code> et il y a une exception ou une erreur qui va évidemment être traitée par un conseil, etc., je ne peut pas muté code> ces en-têtes déjà existants, déjà ajoutés par le filtre. P>

@ControllerAdvice
@Slf4j
public class GlobalErrorHandler


2 commentaires

Utilisez-vous @rescontroller (ou contrôleur) pour exposer vos API?


Oui. Mise à jour de la question avec un peu plus de contexte - liée à votre réponse ci-dessous


3 Réponses :


0
votes

Je suis supposé que vous utilisiez Spring-mvc code> (comme vous l'avez mentionné dans vos balises); Si oui, vous pouvez lier à httpservletresponse code> pour ajouter vos en-têtes. Vous pouvez le faire dans votre gestionnaire de méthode, comme SO:

@RestController
class HelloWorkController{

    @GetMapping("/hello")
    public ResponseEntity<String> test(HttpServletResponse response){
        return ResponseEntity.status(HttpStatus.OK)
                .header("test", "4567")
                .body("hello world");
    }
}


1 commentaires

Peut-être une phrase trompeuse de mon côté - cela fonctionne! Mais il semble que le filtre ajoute les en-têtes de réponse avant de faire une logique commerciale réelle. Disons que mon système appelle un service en aval et obtient une réponse 404 qu'il souhaite revenir comme un puits A 404, alors seulement lorsque j'ai effectué n'importe quel traitement, et je suis prêt à revenir au client - ma réponse que je veux définir l'en-tête et non auparavant. Au moins c'est ce que je vois se passe. Filtre -> Filtre -> Contrôleur / Service



2
votes

4 commentaires

C'est exactement mon problème! La seconde partie. J'ai donc un filtre, que de toute façon ajoute des en-têtes de contrôle de cache par défaut par demande. Qui va bien et fonctionne. Maintenant, lorsque si l'un de ces contrôleurs existe une exception, le contrôleurAdvice WIL effectue la gestion des exceptions et retournera une erreur d'erreur personnalisée. Ce que je vois, c'est que l'en-tête de contrôle du cache est ajouté quand même pour répondre par le filtre, et lorsque j'essaie de faire une logique supplémentaire - par exemple, changez probablement la valeur de l'en-tête sur le gestionnaire d'erreurs comme vous apparition ci-dessus, je finis par avec la même en-tête et les mêmes valeurs contradictoires !!!!


J'ai mis à jour ma question afin de indiquer ce bizarre - comportement comme indiqué ci-dessus


@javapapo Il s'avère que réponse.Setheader () est différent de la réponse réponse.Ajouter () . Ce dernier ajoutera la valeur d'en-tête sur la valeur existante de la même en-tête qui permettra à la même en-tête d'avoir plusieurs valeurs. Il peut donc entraîner des problèmes d'en-tête dupliqués que vous avez mentionnés. J'ai révisé les codes dans le globeerrorhandler pour utiliser réponse.Setheader () afin d'éviter ce problème. De plus, ce que je suggère d'utiliser cachecontrolbodyAdvice mais pas votre cachecontrolfilter ...


Correct - merci beaucoup. Je pense que je vais juste faire cela, remplacer le filtre avec le conseil, il semble que le seul moyen d'avoir un contrôle total et de ne pas devenir fou!



-1
votes

Il existe une douzaine de façons de modifier un httppservletresponse avant de revenir au client au printemps et de l'injection de la réponse dans la méthode du gestionnaire ou de la levier contrôleuradvice sont des solutions valides. Cependant, je ne comprends pas la prémisse sous-jacente de votre question que les filtres ne peuvent pas faire le travail:

J'ai déjà 2 un autre inscrit inscrit, qui fonctionne bien - Mais évidemment, je ne peux pas faire la logique - une fois le traitement terminé.

en ce qui concerne la modification httpServletResponse est concernée, filtres fonctionne totalement pour moi et sont au moins aussi appropriés que tout autre outil pour ce travail: < / p> xxx


3 commentaires

Peut-être une phrase trompeuse de mon côté - cela fonctionne! Mais il semble que le filtre ajoute les en-têtes de réponse avant de faire une logique commerciale réelle. Disons que mon système appelle un service en aval et obtient une réponse 404 qu'il souhaite revenir comme un puits A 404, alors seulement lorsque j'ai effectué n'importe quel traitement, et je suis prêt à revenir au client - ma réponse que je veux définir l'en-tête et non auparavant. Au moins c'est ce que je vois se passe. Filtre -> Filtre -> Contrôleur / Service ...


Dans une implémentation de filtre dans la méthode DOFILTERInternal, le code avant l'appel à DOFilter est exécuté avant le contrôleur, le code après l'exécution de l'appel à DOFILTER est exécuté après le contrôleur.


Après que le dofiltre soit trop tard, la réponse a peut-être été rinçue / engagée, ce qui signifie que les modifications apportées à la réponse sont ignorées.