Wie erhalte ich eine Anforderungs-URI ohne Kontextpfad?

Lesezeit: 4 Minuten

Benutzer-Avatar
Handwerker

Die Methode request.getRequestURI() gibt URI mit Kontextpfad zurück.

Wenn beispielsweise die Basis-URL einer Anwendung lautet http://localhost:8080/myapp/ (dh der Kontextpfad ist meine App), und ich rufe an request.getRequestURI() zum http://localhost:8080/myapp/secure/userses wird zurückkehren /myapp/secure/users.

Gibt es eine Möglichkeit, nur diesen Teil zu bekommen? /secure/usersalso die URI ohne Kontextpfad?

  • mögliches Duplikat von Was ist der Unterschied zwischen den Methoden getRequestURI und getPathInfo in HttpServletRequest?

    – Leonel

    6. Juli 2012 um 18:16 Uhr

Benutzer-Avatar
BalusC

Wenn Sie sich in einem Front-Controller-Servlet befinden, das einem Präfixmuster wie z /foo/*dann kannst du einfach verwenden HttpServletRequest#getPathInfo().

String pathInfo = request.getPathInfo();
// ...

Angenommen, das Servlet in Ihrem Beispiel ist zugeordnet /secure/*dann kommt das zurück /users Dies wären die Informationen, die in einem typischen Front-Controller-Servlet von alleinigem Interesse sind.

Wenn das Servlet jedoch auf ein Suffixmuster wie z *.foo (Ihre URL-Beispiele zeigen jedoch nicht, dass dies der Fall ist), oder wenn Sie sich tatsächlich in einem Filter befinden (wenn das aufzurufende Servlet noch nicht unbedingt bestimmt ist, also getPathInfo() zurückkehren könnte null), dann ist es am besten, den Anforderungs-URI selbst basierend auf der Länge des Kontextpfads unter Verwendung der üblichen Zeichenfolge zu substringieren String Methode:

HttpServletRequest request = (HttpServletRequest) req;
String path = request.getRequestURI().substring(request.getContextPath().length());
// ...

  • Gibt es einen Grund, dies stattdessen zu verwenden? getServletPath()? Ich schreibe einen Filter und das ist mir aufgefallen getPathInfo() kehrt zurück nullaber getServletPath() liefert den Pfad abzüglich des Kontexts (geeignet zur Weitergabe an den Request-Dispatcher).

    – Jason C

    25. Juni 2017 um 23:00 Uhr


  • @JasonC: Wie beantwortet, getPathInfo() gibt null zurück, wenn das Front-Controller-Servlet keinem Präfixmuster zugeordnet ist.

    – BalusC

    26. Juni 2017 um 5:41 Uhr


  • Ja. Ich meinte: Gibt es einen Grund, warum Sie getPathInfo getServletPath vorziehen? Viele der anderen hoch bewerteten Antworten hier verwenden getServletPath auch nicht, was mich misstrauisch macht und warum ich mich frage. Ich habe ein Servlet-Projekt, an dem ich arbeite, und ich versuche, meine Fähigkeiten etwas aufzupolieren.

    – Jason C

    26. Juni 2017 um 12:47 Uhr


  • @JasonC: Der Servlet-Pfad kann sich ändern, wenn Sie ein Servlet-basiertes MVC-Framework wie JSF oder Spring MVC installiert haben. Es stellt dann den internen Pfad des MVC-Frameworks dar (z /foo.xhtml Anstatt von /foo.jsf) und nicht der tatsächliche Anforderungs-URI (der Endbenutzer würde ihn in der Adressleiste des Browsers sehen). Der ursprüngliche Servlet-Pfad ist in diesem Fall jedoch als Request-Attribut mit Schlüssel auflösbar RequestDispatcher.FORWARD_SERVLET_PATH. In jedem Fall fragt die Frage explizit nach dem Anforderungs-URI (wie in der Adressleiste des Browsers), daher basiert die Antwort darauf.

    – BalusC

    26. Juni 2017 um 13:15 Uhr


request.getRequestURI().substring(request.getContextPath().length())

  • Genial! Das ist genau das, wonach ich gesucht habe.

    – Handwerker

    25. November 2010 um 14:57 Uhr

  • +1 Ich denke, dies ist eine bessere Antwort als getPathInfo, da getPathInfo null und andere Kuriositäten sein kann. Verschiedene Spring-Codes verwenden getContextPath und entfernen es aus dem URI, genau wie Sie es anstelle von getPathInfo getan haben.

    – Adam Gent

    3. Januar 2012 um 14:23 Uhr

Mit Spring können Sie:

String path = new UrlPathHelper().getPathWithinApplication(request);

  • Natürlich wäre es sinnvoll, eine Instanz des UrlPathHelper z. B. als Klassenmitgliedsvariable zu behalten …

    – James

    31. Juli 2015 um 14:36 ​​Uhr

  • Wie können wir die tatsächliche Anfragezuordnungs-URL erhalten? Bitte führen Sie hier: stackoverflow.com/questions/60446807/…

    – PAA

    28. Februar 2020 um 7:47 Uhr

getPathInfo() gibt manchmal null zurück. In Dokumentation HttpServletRequest

Diese Methode gibt null zurück, wenn keine zusätzlichen Pfadinformationen vorhanden waren.

Ich brauche den Pfad zur Datei ohne Kontextpfad in Filter und getPathInfo() gibt mir null zurück. Also verwende ich eine andere Methode: httpRequest.getServletPath()

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    HttpServletResponse httpResponse = (HttpServletResponse) response;

    String newPath = parsePathToFile(httpRequest.getServletPath());
    ...

}

Wenn Sie request.getPathInfo() innerhalb eines Filters verwenden, scheinen Sie immer null zu erhalten (zumindest mit Jetty).

Dieser knappe ungültige Fehler + Antwort spielt meiner Meinung nach auf das Problem an:

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 Anfrage erhält. Es kann sich um einen Containerfehler oder ein erwartetes Verhalten handeln, das ich nicht identifizieren konnte.

Der contextPath ist jedoch verfügbar, sodass die fforws-Lösung auch in Filtern funktioniert. Ich mag es nicht von Hand machen zu müssen, aber die Umsetzung ist kaputt bzw

Benutzer-Avatar
PeterMmm

Eine Möglichkeit, dies zu tun, besteht darin, den Servelet-Kontextpfad von der Anforderungs-URI zurückzusetzen.

String p = request.getRequestURI();
String cp = getServletContext().getContextPath();

if (p.startsWith(cp)) {
  String.err.println(p.substring(cp.length());
}

Lesen hier .

Benutzer-Avatar
Colin

Vielleicht können Sie einfach die Split-Methode verwenden, um zum Beispiel „/myapp“ zu eliminieren:

string[] uris=request.getRequestURI().split("https://stackoverflow.com/");
string uri="https://stackoverflow.com/"+uri[1]+"https://stackoverflow.com/"+uris[2];

  • Dies führt zu Problemen, wenn ich meine Anwendung als Root bereitstelle und ihre Basis-URL wird lokaler Host: 8080. In diesem Fall würde request.getRequestURI() “/secure/user” zurückgeben und Ihre Split-Methode wird hier Probleme verursachen. Der Code sollte nicht von der Bereitstellung abhängig sein.

    – Handwerker

    25. November 2010 um 14:36 ​​Uhr

1338700cookie-checkWie erhalte ich eine Anforderungs-URI ohne Kontextpfad?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy