2009-08-10 13 views
23

Próbuję pobrać aktualny adres URL strony za pomocą obiektu żądania Java. Korzystam z request.getRequestURI() w celu wykonania tego, ale zauważyłem, że gdy klasa Java przekierowuje mnie do innej strony poza serwletem, żądanie getRequestURI nadaje temu adresowi przeciwieństwo oryginalnego adresu URL wpisanego w przeglądarce i który wciąż wyświetla się w przeglądarce.Java HttpServletRequest uzyskać adres URL w przeglądarce Pasek adresu URL

Ex: \ AdvancedSearch:
getRequestURI() powraca "\ podkatalog \ Search \ search.jsp"

Szukam sposobu, aby chwycić co przeglądarka widzi jako adres URL i nie wie, co to jest strona tylko opakowanie serwletu.

+0

odpowiedź w link poniżej zdecydowanie komuś pomóc. [http://stackoverflow.com/questions/8024344/user-login-with-jsf-2-0/39379256#39379256](http://stackoverflow.com/questions/8024344/user-login-with-jsf -2-0/39379256 # 39379256) –

Odpowiedz

38

Jeśli bieżące żądanie pochodzi z "wewnątrz serwera aplikacji" przekazującego lub dołączającego, serwer aplikacji powinien zachować informacje o żądaniu jako atrybuty żądania. Konkretne atrybuty i ich zawartość zależą od tego, czy robisz forward lub include.

Dla <jsp:include>, oryginalny rodzic URL zostaną zwrócone przez request.getRequestURL() oraz informacje o dołączonego stronie będzie można znaleźć w następującym wniosku atrybuty:

 javax.servlet.include.request_uri 
    javax.servlet.include.context_path 
    javax.servlet.include.servlet_path 
    javax.servlet.include.path_info 
    javax.servlet.include.query_string 

Dla <jsp:forward>, nowy adres URL zostanie zwrócony przez request.getRequestURL() , a informacje o pierwotnym żądaniu znajdują się w następujących atrybutach żądania:

 javax.servlet.forward.request_uri 
    javax.servlet.forward.context_path 
    javax.servlet.forward.servlet_path 
    javax.servlet.forward.path_info 
    javax.servlet.forward.query_string 

Zostały one przedstawione w punktach 8.3 i 8.4 specyfikacji serwletu 2.4.

Należy jednak pamiętać, że te informacje są zachowywane tylko w przypadku żądań wysłanych wewnętrznie. Jeśli masz zewnętrzny serwer WWW lub wysyłany poza bieżący kontener, wartości te będą miały wartość null. Innymi słowy, możesz nie mieć możliwości znalezienia oryginalnego adresu URL żądania.

+0

Próbowałem out.println (request.getAttribute ("request_uri")); \t out.println (request.getAttribute ("ścieżka_kontekstu")); \t out.println (request.getAttribute ("servlet_path")); \t out.println (request.getAttribute ("path_info")); \t obecnie.println (request.getAttribute ("query_string")); Wszystkie zwrócone zero. Czy to znaczy, że jestem spieprzony? – Ballsacian1

+4

Rzeczywista nazwa atrybutu to "javax.servlet.include.request_uri", a nie "request_uri" – kdgregory

+0

Dzięki temu działa. Muszę dodać trochę więcej logiki w mojej nawigacji, ale hej oszczędza mi wielu kłopotów. Dzięki. – Ballsacian1

5
String activePage = ""; 
    // using getAttribute allows us to get the orginal url out of the page when a forward has taken place. 
    String queryString = "?"+request.getAttribute("javax.servlet.forward.query_string"); 
    String requestURI = ""+request.getAttribute("javax.servlet.forward.request_uri"); 
    if(requestURI == "null") { 
     // using getAttribute allows us to get the orginal url out of the page when a include has taken place. 
     queryString = "?"+request.getAttribute("javax.servlet.include.query_string"); 
     requestURI = ""+request.getAttribute("javax.servlet.include.request_uri"); 
    } 
    if(requestURI == "null") { 
     queryString = "?"+request.getQueryString(); 
     requestURI = request.getRequestURI(); 
    } 
    if(queryString.equals("?null")) queryString = ""; 
    activePage = requestURI+queryString; 
2

$ {requestScope [ 'javax.servlet.forward.query_string']} - jeśli dostęp tworzyć JSP, używając ekspresji jezyk

8

Podobnie zrobił niewielki Tidy roztworu przez Ballsacian1

String currentURL = null; 
if(request.getAttribute("javax.servlet.forward.request_uri") != null){ 
    currentURL = (String)request.getAttribute("javax.servlet.forward.request_uri"); 
} 
if(currentURL != null && request.getAttribute("javax.servlet.include.query_string") != null){ 
    currentURL += "?" + request.getQueryString(); 
} 

Kontrole zerowe będą przebiegać dużo wydajniej niż porównania ciągów.

+0

Dzięki za to. Chociaż obecnie nie jest to dla mnie zbyt przydatne, to jest jedno z tych pytań, które na pewno wrócą do mnie w przyszłości. – Ballsacian1

+0

@readikus - powinno to być 'javax.servlet.forward.query_string' zamiast' javax.servlet.include.query_string'? –

1

możesz spróbować tej

<%=request.getRequestURL().toString()%> 
1

Aby uzyskać ścieżkę żądanie HTTP bez znać stan przepływu wewnętrznego wniosku, należy użyć tej metody:

public String getUri(HttpServletRequest request) { 
    String r = (String) request.getAttribute("javax.servlet.forward.request_uri"); 
    return r == null ? request.getRequestURI() : r; 
}