2009-08-10 171 views
23

所以我試圖用Java的請求對象來抓取頁面的當前URL。我一直在使用request.getRequestURI()來預處理這個,但我注意到當一個java類將我重定向到一個不同的頁面時,servlet請求getRequestURI給出了該地址,而不是在瀏覽器中輸入的原始URL,它仍然在瀏覽器中顯示。Java HttpServletRequest在瀏覽器中獲取URL地址欄

例如:\填寫AdvancedSearch:
getRequestURI()返回「\子目錄\搜索\ search.jsp的」

我正在尋找一種方式來抓取瀏覽器看到的內容爲網址,而不是該頁面知道是什麼只有一個servlet包裝器。

+0

下面將鏈接答案肯定幫助別人。 [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) – 2016-09-07 21:31:45

回答

38

如果您當前的請求來自「內部應用程序服務器」轉發或包含,則預計應用程序服務器將請求信息保留爲請求屬性。具體屬性及其包含的內容取決於您是在進行前瞻還是包含。

對於<jsp:include>,原始父URL將被request.getRequestURL()被退回,並且對包含頁面將在下面的請求中找到的信息屬性:

 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 

對於<jsp:forward>,新的URL將被request.getRequestURL()被退回和原始請求的信息將在以下請求中找到的屬性:

 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 

這些載於8.3節和Servlet 2.4規範的8.4。

但是,請注意,此信息僅保留用於內部調度的請求。如果您有前端Web服務器或在當前容器之外進行分派,則這些值將爲空。換句話說,您可能無法找到原始請求網址。

+0

我試過out.println(request.getAttribute(「request_uri」)); \t out.println(request.getAttribute(「context_path」)); \t out.println(request.getAttribute(「servlet_path」)); \t out.println(request.getAttribute(「path_info」)); \t out。的println(request.getAttribute( 「QUERY_STRING」)); 全部返回null。這是否意味着我被搞砸了? – Ballsacian1 2009-08-10 19:12:22

+4

實際的屬性名稱是「javax.servlet.include.request_uri」,而不是「request_uri」 – kdgregory 2009-08-10 19:16:50

+0

謝謝你的作品。在我的導航中需要添加更多的邏輯,但是嘿,爲我節省了很多麻煩。謝謝。 – Ballsacian1 2009-08-10 19:49:15

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']} - 如果你訪問它形成JSP,使用表達式語言

8

通過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(); 
} 

空檢查將比字符串比較運行更有效。

+0

感謝您的支持。雖然目前對我沒有多大用處,但這是我肯定會在未來回到我身邊的那些問題之一。 – Ballsacian1 2012-09-05 02:18:34

+0

@readikus - 應該是'javax.servlet.forward.query_string'而不是'javax.servlet.include.query_string'嗎? – 2017-07-05 17:18:40

1

你可以試試這個

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

要獲得HTTP請求的路徑不知道請求的內部流動的狀態下,使用此方法:

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