Context-Pfad mit url-pattern Umleitung im Frühjahr
Ich bin mit ein bisschen ein Rätsel mit Pfaden und urls auf einem tomcat-server, lassen Sie mich erklären:
Meine tomcat-webapp-Verzeichnis ist: /server -
Ich bereitgestellt haben, eine spring-Anwendung im Verzeichnis /server/myapp/Unterordner
Das heißt, mein Kontext Pfad /server/Anwendung
Meinem servlet eine url-pattern von /Unterordner/*
Mein servlet zu erreichen unter url http://server.com/myapp/subfolder/
Viele von meinen spring Controller ich wieder ein redirect:
return "redirect:/item/list";
Dieser leitet den Besucher zu http://server.com/myapp/item/list
Dies ist natürlich eine 404 verursachen Sie die richtige url ist: http://server.com/myapp/subfolder/item/list
Dies kann leicht gelöst werden, indem alles ist eine separate webapp oder einfach entfernen Sie die url-Muster. Aber beide sind nicht möglich, da eine separate webapp bedeutet eine unterschiedliche class-loader (Ursachen problem mit anderen Systemen) und url-pattern wie /Konflikt mit anderen Anwendungen auf dem server ausgeführt.
Ändern kann ich meine Umleitung zu "redirect:/Unterordner/item/list", das wird beheben die Weiterleitung.
Gibt es vielleicht eine bessere Lösung, so dass ich nicht haben, um manuell hinzufügen "Unterordner/" überall die contextpath wird verwendet?
- Siehe spring-mvc-relative-redirect-from-httpservletresponse
- Haben Sie versucht
return "redirect:item/list";
? - der Frühling ist nicht, dass smart 🙂 Es geht um server.com/myapp/subfolder/item/list/item/list, die Sinn macht in einer Art und Weise.
- getContextPath nicht das url-Muster...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eher als harte Verdrahtung Ihre apps Kontext-Pfad, können Sie es aus dem HttpServletRequest.getContextPath().
Frühjahr hat die
ServletUriComponentsBuilder
die Sie verwenden können, zu Ihrem Vorteil. Können Sie geben Sie die aktuelle Anfrage und lassen Sie es Anhängen, wo Sie wollen, um zu springen. Spart Euch die hartcodierung der/subfolder
oder was auch immer Sie tun.Natürlich könnte man dies in einer utility-Methode. Dies funktioniert nur, wenn Sie die Umleitung zu einer URL innerhalb der gleichen
DispatcherServlet
..fromPath("/item/list")
brichtfromServletMapping(request)
. Verwenden Sie nur eine dieserfrom*
Methoden, und bauen Sie Ihre URI mit den anderen Methoden.Ich weiß, das ist eine alte Frage, aber wenn jemand sucht für die Antwort, RedirectView (zumindest in der neuesten version 5.0.9) hat eine contextRelative boolean-parameter, der standardmäßig false ist. Einstellung auf true lässt den redirect Kontext relativ. Zum Beispiel:
Referenz: docs
Am Ende habe ich einfach eine util Funktion:
Etwas hacky, aber es erlaubt mir, schnell zu ändern "Unterordner" bei den url-Muster verpasst.
Den @url-tag in den anzeigen verwendet auch contextpath, so dass ich meine eigene @url-tag hinzufügt "Unterordner", um den contextpath.
Frühling scheint nun glücklich, ich bekomme keine 404 mehr.