[JAVA] Ich möchte das Flash-Attribut im Frühjahr, auch wenn ich einen Reverse-Proxy festgelegt habe! (TU es nicht)

Fazit

Wenn die URL, auf die zugegriffen werden soll, und die von Spring empfangene Anforderungs-URL unterschiedlich sind, können Sie selbst mit FlashAttribute keine Parameter an das Umleitungsziel übergeben! !!

Der Anfang der Dinge

Angenommen, Sie haben einen Proxy erstellt, um eine Anforderung für "domain / ~" in "domain / hoge / ~" zu ändern. Ich bin sicher, es sieht so aus: Küssen: (angemessen)

nginx.conf


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

Als ich addFlashAttribute von RedirectAttributes ausführte, stieß ich dabei auf eine Situation, in der es nicht am Umleitungsziel zugeordnet wurde. Vielleicht so etwas: kissing_heart: (passender)

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); //leer! !!
    return "hoge.html";
}

Sie können sich FlashAttribute leisten! Das Problem, das kurz vor meinem Gedanken auftrat. Ich habe aus der umgekehrten Proxy-Richtung nachgeforscht, aber ich kenne die Ursache überhaupt nicht. .. ..

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

Ein paar Tage später

: desktop: "Wenn Umleitungsattribute nicht funktionieren, können Sie FlashMap direkt verwenden."

Was für eine Empörung! Wenn ich mir die Implementierungsmethode beim Nachdenken anschaue, rufe ich eine Methode namens setTargetRequestPath auf. .. ..

: hashed: ... Ziel ... Pass?

Lass es uns erklären! !!

Was passierte war, dass der FlashMap-Wert nicht gebunden war, weil der umgeleitete Pfad (/ complete) und der umgeleitete Pfad ( / hoge / complete) nicht übereinstimmten! !!

Reparaturbeispiel

Mit dieser Art von Änderung können Parameter an das Umleitungsziel übergeben werden, selbst wenn der Reverse-Proxy festgelegt ist.

AbstractController.java


protected String redirect(String path, Map<String,Object> attributeMap) {
	//Interner Pfad(@RequestMapping(value)Der Wert der)
	String innerPath = "/hoge" + path;
	//Füllen Sie FlashMap nach
	FlashMap flashMap = new FlashMap();
	attributeMap.forEach(flashMap::put);
	//Setzen Sie das FlashMap-Ziel auf den internen Pfad
	flashMap.setTargetRequestPath(innerPath);
	//FlashMap eingestellt
	RequestContextUtils.getFlashMapManager(request).saveOutputFlashMap(flashMap, request, response);
	//Das Umleitungsziel ist ein externer Pfad(Zugriff über den Browser)
	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));
}

Selbst wenn Sie das Umschreiben verwenden und der interne Pfad und der externe Pfad nicht einfach wie diesmal ersetzt werden können, ist das Prinzip dasselbe. Geben Sie also Ihr Bestes ** und geben Sie den internen Pfad und den externen Pfad an.

FlashMap wurde im folgenden Artikel leicht verständlich geschrieben. Ich wollte es früher finden. .. .. : unschuldig: Übergeben Sie den Wert an das Umleitungsziel, ohne Umleitungsattribute in Spring MVC zu verwenden

Recommended Posts

Ich möchte das Flash-Attribut im Frühjahr, auch wenn ich einen Reverse-Proxy festgelegt habe! (TU es nicht)
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich möchte eine Parkettdatei auch in Ruby erstellen
Wenn in Ruby Hash [: a] [: b] [: c] = 0 ist, möchten wir, dass Sie rekursiv erweitern, auch wenn der Schlüssel nicht vorhanden ist
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
"Lehrer, ich möchte im Frühjahr eine Anmeldefunktion implementieren" ① Hallo Welt
Ich möchte irgendwann sogar in Kotlin sein
Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 (Black Magic) ausgeben.
Ich möchte so etwas wie "cls" in Java machen
Ich möchte ein kleines Symbol in Rails verwenden
Ich möchte eine Funktion in der Rails Console definieren
Ich möchte in RSpec auf einen GoogleMap-Pin klicken
MockMVC gibt 200 zurück, auch wenn ich eine Anfrage an einen Pfad stelle, der nicht existiert
Auch wenn ich den Inhalt eines Datenobjekts in Java in JSON konvertieren möchte, gibt es einen Zirkelverweis ...
Was tun, wenn in GlassFish eine java.io.IOException auftritt?
Ich möchte einen relativen Pfad in einer Situation finden, in der Pfad verwendet wird
Ich möchte dem select-Attribut einen Klassennamen geben
So richten Sie einen Proxy mit Authentifizierung in Feign ein
[Wire Mock] Ich möchte einen Stub / Mock-Server in Java einrichten und E2E-Tests durchführen.
Benötige ich einen Test, wenn ich DDD in einer Sprache mit einem Typ mache?
Was tun, wenn in Docker ein gcc-Fehler auftritt?
[Rails] Was tun, wenn keine Daten in der Datenbank registriert sind?
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Was tun, wenn der Vorgang nicht zulässig ist, wenn ein Befehl im Terminal ausgeführt wird?
[Rails] Ich möchte Daten verschiedener Modelle in einem Formular senden
Was tun, wenn Sie in Thymeleaf Layout eine groovige Warnung erhalten?
Was tun, wenn das Präfix c in JSP nicht gebunden ist?
Ich möchte im Dialogfeld mehrere Elemente mit einem benutzerdefinierten Layout auswählen
[Hinweis] Ich möchte mit afterLast mit JdbcTemplate in umgekehrter Reihenfolge arbeiten
Ich kann nicht bauen, wenn ich das Build-Ziel mit XCode12 auf einen Simulator setze!
Wenn Sie Werte dynamisch einbetten und Attributwerten in Thymeleaf 3 Text hinzufügen möchten
Ich möchte ein chinesisches (koreanisches) PDF mit dünnen Berichten anzeigen
Mein Memorandum, dass ich ValidationMessages.properties UTF8 in Spring Boot erstellen möchte
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
[Java Spring MVC] Ich möchte DI in meiner eigenen Klasse verwenden
Ich möchte eine Webanwendung entwickeln!
Ich möchte ein schönes build.gradle schreiben
Ich möchte einen Unit Test schreiben!
Was tun, wenn Sie die Mastertabelle nach dem Importieren eines Projekts in Eclipse nicht in einer Datei speichern konnten?
Ich möchte @Autowired in Servlet verwenden
Hinzufügen, wenn nicht in Set, Fehlermeldung, wenn
Ich möchte die Teamentwicklung aus der Ferne durchführen
Lassen Sie uns eine TODO-Anwendung mit Java 2 erstellen. Ich möchte eine Vorlage mit Spring Initializr erstellen und eine Hello-Welt erstellen
Was tun, wenn die Änderungen nicht in der JAR-Manifestdatei berücksichtigt werden?
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Royal Road Edition, die weder Magie noch irgendetwas ist)
Ich möchte eine E-Mail in Java senden.
Ich möchte APP_HOME an Logback in Gradle übergeben
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich möchte eine einfache Wiederholung einer Zeichenkette schreiben
So fügen Sie in Spring Boot einen Klassenpfad hinzu
Ich möchte eine Struktur für die Ausnahmebehandlung entwerfen
rsync4j - Ich möchte rsync in Java berühren.