2010-11-25 14 views
101

Die Methode request.getRequestURI() gibt URI mit Kontextpfad zurück.Wie bekomme ich Anfrage-URI ohne Kontextpfad?

Wenn beispielsweise die Basis-URL einer Anwendung ist http://localhost:8080/myapp/ (das heißt der Kontext Pfad MeineAnw), und ich rufe request.getRequestURI() für http://localhost:8080/myapp/secure/users, wird es /myapp/secure/users zurückzukehren.

Gibt es eine Möglichkeit, dass wir nur diesen Teil /secure/users erhalten, d. H. Die URI ohne Kontextpfad?

+2

möglich Duplikat [Was ist der Unterschied zwischen getRequestURI und getPathInfo Methoden in HttpServletRequest?] (http://stackoverflow.com/questions/4931323/whats-the-difference-between-getrequesturi-and-getpathinfo-methods-in-httpservl) – Leonel

Antwort

124

Wenn Du innerhalb eines vorderen contoller Servlet, das auf einem Präfix Muster abgebildet wird, , dann können Sie einfach HttpServletRequest#getPathInfo() verwenden.

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

Unter der Annahme, dass das Servlet in Ihrem Beispiel auf /secure abgebildet wird, dann wird diese /users zurück, die die Informationen des alleinigen Interesses in einem typischen Front-Controller-Servlet sein würde.

Wenn das Servlet jedoch auf ein Suffix-Muster abgebildet wird (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 nicht unbedingt erforderlich ist) noch nicht bestimmt, so konnte getPathInfo()null) zurück, dann Ihre beste Wette ist die Anforderungs-URI sich auf die Länge der üblichen String Methode Kontextpfad basiert auf Teilzeichen:

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

Gibt es einen Grund, dies anstelle von 'getServletPath()' zu verwenden? Ich schreibe einen Filter und mir ist aufgefallen, dass 'getPathInfo() '' '' 'zurückgibt, aber' getServletPath()' gibt den Pfad abzüglich des Kontexts zurück (geeignet für die Weiterleitung an den Request-Dispatcher). –

+0

@JasonC: Wie geantwortet, gibt 'getPathInfo()' null zurück, wenn das Front-Controller-Servlet nicht einem Präfix-Muster zugeordnet ist. – BalusC

+0

Ja. Ich meinte: Gibt es einen Grund, warum Sie getPathInfo über getServletPath bevorzugen? Viele der anderen High-Score-Antworten verwenden auch nicht getServletPath, was mich verdächtig macht und warum ich mich frage. Ich habe ein Servlet-Projekt, an dem ich arbeite, und ich versuche, meine Fähigkeiten zu verbessern. –

2

Eine Möglichkeit, den Servelet-Kontextpfad aus dem Anforderungs-URI wiederherzustellen, ist dies.

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

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

here lesen.

-1

Mai werden Sie können nur die Split-Methode verwenden, um den ‚/ myapp‘ zum Beispiel zu beseitigen:

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

Dies wird zu einem Problem führen, wenn ich meine Anwendung als root bereitstellen und seine Basis-URL wird http: // localhost: 8080 /. In diesem Fall würde request.getRequestURI() "/ secure/user" zurückgeben und Ihre Split-Methode würde hier ein Problem verursachen. Der Code sollte nicht von der Bereitstellung abhängig sein. – craftsman

60
request.getRequestURI().substring(request.getContextPath().length()) 
+0

Super! Genau das habe ich gesucht. – craftsman

+4

+1 Ich denke, das ist eine bessere Antwort als getPathInfo aufgrund der Tatsache, dass getPathInfo Null und andere Kuriositäten sein kann. Verschiedener Spring-Code ruft getContextPath auf und entfernt ihn genauso wie Sie anstelle von getPathInfo aus dem URI. –

+2

Funktionieren diese Servlets einen Load-Balancer? –

11

getPathInfo() null zurück. In der Dokumentation HttpServletRequest

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

Ich brauche Pfad zu Datei ohne Kontextpfad in Filter und getPathInfo() gib mir Null. So 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()); 
    ... 

} 
4

Wenn Sie request.getPathInfo() in einem Filter verwenden, Sie scheinen immer null zu bekommen (zumindest mit Steg).

Diese lapidaren ungültig Fehler + Antwort verweist auf die Frage, die ich denke:

https://issues.apache.org/bugzilla/show_bug.cgi?id=28323

Ich vermute, dass es mit der Tatsache verbunden ist, die ausgeführt filtern, bevor das Servlet die Anforderung erhält. Es kann sich um einen Container-Bug oder ein erwartetes Verhalten handeln, das ich nicht identifizieren konnte.

Der contextPath ist jedoch verfügbar, daher funktioniert fforws solution auch in Filtern. Ich weiß nicht wie es von Hand zu tun haben, aber die Umsetzung ist gebrochen oder

19

Mit Frühling können Sie tun:

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

Natürlich wäre es sinnvoll, eine Instanz des UrlPathHelper z. als Klassenmitgliedsvariable ... – James

Verwandte Themen