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 J'ai déjà 2 Cache-Control CODE> Exemple d'en-têtes Ne pas cache ou quelque chose comme ça. P>
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
3 Réponses :
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");
}
}
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
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 code> ce bizarre - comportement comme indiqué ci-dessus
@javapapo Il s'avère que réponse.Setheader () code> est différent de la réponse
réponse.Ajouter () code>. 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 code> pour utiliser
réponse.Setheader () code> afin d'éviter ce problème. De plus, ce que je suggère d'utiliser
cachecontrolbodyAdvice code> mais pas votre
cachecontrolfilter code> ...
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!
Il existe une douzaine de façons de modifier un 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é. P>
blockQuote> en ce qui concerne la modification httppservletresponse code> 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 code> 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:
httpServletResponse code> est concernée,
filtres code> fonctionne totalement pour moi et sont au moins aussi appropriés que tout autre outil pour ce travail: < / p>
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.
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 code> ci-dessous