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! !!
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:
: 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?
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! !!
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