Metoda request.getRequestURI () zwraca identyfikator URI ze ścieżką kontekstu.
Na przykład, jeśli adres URL podstawa wniosku jest http://localhost:8080/myapp/
(czyli ścieżka kontekstu jest MojaApl ) i wzywam request.getRequestURI()
do http://localhost:8080/myapp/secure/users
, powróci /myapp/secure/users
.
Czy jest jakiś sposób, abyśmy mogli uzyskać tylko tę część /secure/users
, tj. Identyfikator URI bez ścieżki kontekstu?
Odpowiedzi:
Jeśli jesteś wewnątrz serwletu przedniego kontrolera, który jest mapowany na wzorzec prefiksu, możesz po prostu użyć
HttpServletRequest#getPathInfo()
.Zakładając, że serwlet w twoim przykładzie jest odwzorowany
/secure
, to zwróci to,/users
co będzie jedyną interesującą informacją wewnątrz typowego serwletu kontrolera frontowego.Jeśli jednak serwlet jest mapowany na wzorzec sufiksu (przykłady adresów URL nie wskazują jednak, że tak jest), lub gdy faktycznie znajdujesz się w filtrze (gdy aplet, który ma zostać wywołany, nie jest jeszcze koniecznie określony, więc
getPathInfo()
może powrócićnull
), najlepszym rozwiązaniem jest samodzielne przesłanie podciągu URI żądania na podstawie długości ścieżki kontekstu przy użyciu zwykłejString
metody:źródło
getServletPath()
? Piszę filtr i zauważyłem, żegetPathInfo()
zwracanull
, alegetServletPath()
zwraca ścieżkę bez kontekstu (nadaje się do przekazania do dyspozytora żądania).getPathInfo()
zwraca wartość null, jeśli serwlet kontrolera frontowego nie jest odwzorowany na wzorzec prefiksu./foo.xhtml
Zamiast/foo.jsf
), a nie rzeczywisty identyfikator URI żądania (ten, który użytkownik końcowy zobaczy na pasku adresu przeglądarki). Oryginalna ścieżka serwletu jest w takim przypadku możliwa do rozwiązania jako atrybut żądania z kluczemRequestDispatcher.FORWARD_SERVLET_PATH
. W każdym razie pytanie wyraźnie prosi o podanie identyfikatora URI żądania (jak w pasku adresu przeglądarki), więc odpowiedź jest oparta na tym.źródło
Dzięki Springowi możesz:
źródło
getPathInfo () czasami zwraca wartość null. W dokumentacji HttpServletRequest
Potrzebuję ścieżki do pliku bez ścieżki kontekstowej w filtrze i getPathInfo () zwraca mi wartość null. Więc używam innej metody: httpRequest.getServletPath ()
źródło
Jeśli używasz request.getPathInfo () wewnątrz filtru, zawsze wydaje się, że otrzymujesz wartość null (przynajmniej z jetty).
Ten zwięzły, nieprawidłowy błąd + odpowiedź nawiązuje do problemu, który moim zdaniem:
https://issues.apache.org/bugzilla/show_bug.cgi?id=28323
Podejrzewam, że jest to związane z faktem, że filtry działają, zanim serwlet otrzyma żądanie. Może to być błąd kontenera lub oczekiwane zachowanie, którego nie byłem w stanie zidentyfikować.
Dostępna jest jednak ścieżka contextPath, więc rozwiązanie fforws działa nawet w filtrach. Nie lubię robić tego ręcznie, ale implementacja jest zepsuta lub
źródło
Sposobem na to jest wyłączenie ścieżki kontekstu serwletu z identyfikatora URI żądania.
Przeczytaj tutaj .
źródło
Być może możesz po prostu użyć metody podziału, aby wyeliminować `` / myapp '', na przykład:
źródło