[JAVA] Je veux FlashAttribute au printemps même si j'ai défini un proxy inverse! (ne pas faire)

Conclusion

Si l'URL d'accès et l'URL de demande reçue par Spring sont différentes, vous ne pourrez pas passer de paramètres à la destination de redirection même avec FlashAttribute! !!

Le début des choses

Par exemple, supposons que vous ayez un proxy construit pour changer une demande de domaine / ~ en domaine / hoge / ~. Je suis sûr que cela ressemble à ceci: s'embrasser: (approprié)

nginx.conf


  location / {
    proxy_pass http://tomcat:8080/hoge/;
  }

En cela, lorsque j'ai exécuté addFlashAttribute de RedirectAttributes, j'ai rencontré une situation où il n'était pas mappé à la destination de la redirection. Peut-être quelque chose comme ça: kissing_heart: (plus approprié)

HogeController.java


@RequestMapping(value="/hoge/save", method = RequestMethod.POST)
public String save(@ModelAttribute("form") HogeForm form, RedirectAttributes redirectAttributes) {
        :
        :
    redirectAttributes.addFlashAttribute("form", form);
    return "redirect:/complete";
}

@RequestMapping(value="/hoge/complete", method = RequestMethod.GET)
public String complete(@ModelAttribute("form") HogeForm form) {
    log.info(form); //vide! !!
    return "hoge.html";
}

Vous pouvez vous permettre FlashAttribute! Le problème qui s'est produit juste avant que je pense. J'ai enquêté dans le sens inverse du proxy, mais je ne connais pas du tout la cause. .. ..

:thinking: :thinking: :expressionless: :sleepy: :sleeping:

Quelques jours plus tard

: desktop: "Si les attributs de redirection ne fonctionnent pas, vous pouvez utiliser FlashMap directement."

Quel scandale! En regardant la méthode de mise en œuvre tout en réfléchissant, j'appelle une méthode appelée setTargetRequestPath. .. ..

: haché: ... cible ... passer?

Expliquons! !!

Ce qui se passait, c'est que la valeur de FlashMap n'était pas liée car le chemin redirigé (/ complete) et le chemin redirigé ( / hoge / complete) ne correspondaient pas! !!

Exemple de réparation

Avec ce type de modification, les paramètres peuvent être passés à la destination de redirection même si le proxy inverse est défini.

AbstractController.java


protected String redirect(String path, Map<String,Object> attributeMap) {
	//Chemin interne(@RequestMapping(value)La valeur du)
	String innerPath = "/hoge" + path;
	//Recharger vers FlashMap
	FlashMap flashMap = new FlashMap();
	attributeMap.forEach(flashMap::put);
	//Définir la cible FlashMap sur le chemin interne
	flashMap.setTargetRequestPath(innerPath);
	//Ensemble FlashMap
	RequestContextUtils.getFlashMapManager(request).saveOutputFlashMap(flashMap, request, response);
	//La destination de la redirection est un chemin externe(Accès depuis le navigateur)
	return "redirect:" + path;
}

HogeController.java


@RequestMapping(value="/hoge/save", method = RequestMethod.POST)
public String save(@ModelAttribute("form") HogeForm form) {
        :
        :
    return redirect("/complete", Map.of("form", form));
}

Même si vous utilisez la réécriture et que le chemin interne et le chemin externe ne peuvent pas être simplement remplacés comme cette fois, le principe est le même, alors faites de votre mieux ** et spécifiez le chemin interne et le chemin externe.

FlashMap a été écrit dans l'article suivant d'une manière facile à comprendre. Je voulais le trouver plus tôt. .. .. : innocent: Transmettez la valeur à la destination de redirection sans utiliser les attributs de redirection dans Spring MVC

Recommended Posts

Je veux FlashAttribute au printemps même si j'ai défini un proxy inverse! (ne pas faire)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
Je veux créer un fichier Parquet même en Ruby
Si hash [: a] [: b] [: c] = 0 dans Ruby, je veux que vous étendiez récursivement même si la clé n'existe pas
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (édition PowerMockito)
"Professeur, je souhaite implémenter une fonction de connexion au printemps" ① Hello World
Je veux être finalement même à kotlin
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (deuxième décoction Javassist)
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3 (Black Magic)
Je veux faire quelque chose comme "cls" en Java
Je veux utiliser une petite icône dans Rails
Je souhaite définir une fonction dans la console Rails
Je veux cliquer sur une broche GoogleMap dans RSpec
MockMVC renvoie 200 même si je fais une demande vers un chemin qui n'existe pas
Même si je souhaite convertir le contenu d'un objet de données en JSON en Java, il existe une référence circulaire ...
Que faire lorsqu'une exception java.io.IOException se produit dans GlassFish
Je veux trouver un chemin relatif dans une situation où Path est utilisé
Je veux donner un nom de classe à l'attribut select
Comment configurer un proxy avec authentification dans Feign
[Wire Mock] Je souhaite configurer un serveur stub / simulé en Java et effectuer des tests E2E.
Ai-je besoin d'un test si je fais DDD dans une langue avec un type?
Que faire si vous obtenez une erreur gcc dans Docker
[Rails] Que faire si les données ne sont pas enregistrées dans la base de données
Je veux changer la valeur de l'attribut dans Selenium of Ruby
Que faire si l'opération non autorisée s'affiche lors de l'exécution d'une commande dans le terminal
[Rails] Je souhaite envoyer des données de différents modèles dans un formulaire
Que faire si vous obtenez un avertissement groovy dans Thymeleaf Layout
Que faire lorsque le préfixe c n'est pas lié dans JSP
Je souhaite sélectionner plusieurs éléments avec une disposition personnalisée dans la boîte de dialogue
[Note] Je veux obtenir dans l'ordre inverse en utilisant afterLast avec JdbcTemplate
Je ne peux pas construire si je définis la destination de construction sur un simulateur avec XCode12!
Si vous souhaitez incorporer dynamiquement des valeurs et ajouter du texte aux valeurs d'attribut dans Thymeleaf 3
Je souhaite afficher un PDF chinois (coréen) avec des rapports fins
Mon mémorandum que je veux faire ValidationMessages.properties UTF8 dans Spring Boot
Je veux ForEach un tableau avec une expression Lambda en Java
[Java Spring MVC] Je souhaite utiliser DI dans ma propre classe
Je souhaite développer une application web!
Je veux écrire un joli build.gradle
Je veux écrire un test unitaire!
Que faire si vous obtenez Impossible d'enregistrer la table principale dans un fichier après l'importation d'un projet dans Eclipse
Je veux utiliser @Autowired dans Servlet
Ajouter si non dans l'ensemble, message d'erreur si
Je veux faire du développement d'équipe à distance
Faisons une application TODO avec Java 2 Je veux créer un modèle avec Spring Initializr et créer Hello world
Que faire si les modifications ne sont pas reflétées dans le fichier manifeste JAR
Même en Java, je veux sortir true avec un == 1 && a == 2 && a == 3 (Royal road edition qui n'est ni magique ni rien)
Je souhaite envoyer un e-mail en Java.
Je souhaite transmettre APP_HOME pour me connecter à Gradle
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Je veux écrire une simple répétition d'une chaîne de caractères
Comment ajouter un chemin de classe dans Spring Boot
Je souhaite concevoir une structure pour la gestion des exceptions
rsync4j --Je veux toucher rsync en Java.