Die Methode request.getRequestURI () gibt den URI mit dem Kontextpfad zurück.
Zum Beispiel, wenn die Basis - URL einer Anwendung ist http://localhost:8080/myapp/
(dh der Kontextpfad ist myapp ), und ich rufe request.getRequestURI()
für http://localhost:8080/myapp/secure/users
, kehrt es /myapp/secure/users
.
Gibt es eine Möglichkeit, nur diesen Teil zu erhalten /secure/users
, dh den URI ohne Kontextpfad?
Antworten:
Wenn Sie sich in einem Front-Controller-Servlet befinden, das einem Präfixmuster zugeordnet ist, können Sie es einfach verwenden
HttpServletRequest#getPathInfo()
.Angenommen, das Servlet in Ihrem Beispiel ist zugeordnet
/secure
, wird dies zurückgegeben. Dies sind/users
die Informationen, die innerhalb eines typischen Front-Controller-Servlets von alleinigem Interesse sind.Wenn das Servlet jedoch einem Suffixmuster zugeordnet ist (Ihre URL-Beispiele zeigen jedoch nicht an, dass dies der Fall ist) oder wenn Sie sich tatsächlich in einem Filter befinden (wenn das aufzurufende Servlet noch nicht unbedingt bestimmt ist)
getPathInfo()
könnte zurückkehrennull
), dann ist es am besten, den Anforderungs-URI basierend auf der Länge des Kontextpfads mit der üblichenString
Methode selbst zu unterteilen:quelle
getServletPath()
? Ich schreibe einen Filter und habe festgestellt, dass ergetPathInfo()
zurückgibtnull
, abergetServletPath()
den Pfad abzüglich des Kontexts zurückgibt (geeignet für die Weitergabe an den Anforderungs-Dispatcher).getPathInfo()
null zurück, wenn das Front-Controller-Servlet keinem Präfixmuster zugeordnet ist./foo.xhtml
anstelle von/foo.jsf
) und nicht den tatsächlichen Anforderungs-URI (der als Endbenutzer in der Adressleiste des Browsers angezeigt wird). Der ursprüngliche Servlet-Pfad ist in diesem Fall jedoch als Anforderungsattribut mit Schlüssel auflösbarRequestDispatcher.FORWARD_SERVLET_PATH
. In jedem Fall fragt die Frage explizit nach dem Anforderungs-URI (wie in der Adressleiste des Browsers), sodass die Antwort darauf basiert.quelle
Mit Spring können Sie Folgendes tun:
quelle
getPathInfo () gibt manchmal null zurück. In der Dokumentation HttpServletRequest
Ich muss den Pfad zur Datei ohne Kontextpfad in Filter abrufen und getPathInfo () gibt mir null zurück. Also benutze ich eine andere Methode: httpRequest.getServletPath ()
quelle
Wenn Sie request.getPathInfo () in einem Filter verwenden, scheinen Sie immer null zu erhalten (zumindest mit Anlegestelle).
Dieser knappe ungültige Fehler + Antwort spielt auf das Problem an, das ich denke:
https://issues.apache.org/bugzilla/show_bug.cgi?id=28323
Ich vermute, es hängt damit zusammen, dass Filter ausgeführt werden, bevor das Servlet die Anforderung erhält. Möglicherweise handelt es sich um einen Containerfehler oder ein erwartetes Verhalten, das ich nicht identifizieren konnte.
Der contextPath ist jedoch verfügbar, sodass die fforws-Lösung auch in Filtern funktioniert. Ich mag es nicht, es von Hand machen zu müssen, aber die Implementierung ist kaputt oder
quelle
Eine Möglichkeit, dies zu tun, besteht darin, den Servelet-Kontextpfad vom Anforderungs-URI abzusetzen.
Lesen Sie hier .
quelle
Vielleicht können Sie einfach die Split-Methode verwenden, um das '/ myapp' zu entfernen, zum Beispiel:
quelle