web-dev-qa-db-ja.com

Java HttpServletRequestはブラウザのURLバーでURLを取得します

そのため、Javaのリクエストオブジェクトを使用して、ページの現在のURLを取得しようとしています。 request.getRequestURI()を使用してこれを実行しましたが、Javaクラスがサーブレットリクエストから別のページにリダイレクトすると、getRequestURIはそのアドレスをブラウザーに入力され、ブラウザーにまだ表示されている元のURL。

例:\ AdvancedSearch:
getRequestURI()は「\ subdir\search\search.jsp」を返します

ブラウザがURLとして認識しているものを取得する方法を探していますが、そのページがサーブレットラッパーにすぎないことを認識しているのではありません。

24
Ballsacian1

現在のリクエストがフォワードまたはインクルードの「アプリサーバー内部」から来ている場合、アプリサーバーはリクエスト属性としてリクエスト情報を保持することが期待されます。特定の属性、およびそれらに含まれる内容は、転送を行うか含めるかによって異なります。

_<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
_

これらは、Servlet 2.4仕様のセクション8.3および8.4に記載されています。

ただし、この情報は内部で送信されたリクエストに対してのみ保持されることに注意してください。フロントエンドWebサーバーがある場合、または現在のコンテナーの外部にディスパッチする場合、これらの値はnullになります。つまり、元のリクエストURLを見つける方法がない場合があります。

41
kdgregory

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

Nullチェックは、文字列比較よりもはるかに効率的に実行されます。

8
readikus
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;
5
Ballsacian1

$ {requestScope ['javax.servlet.forward.query_string']}-Expression Languageを使用してjspからアクセスする場合

4
MihaiS

要求の内部フローの状態を知らずにHTTP要求パスを取得するには、次のメソッドを使用します。

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

これを試してもらえますか

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

@kdgregoryと同じ答えですが、むしろRequest Dispatcher定数を使用できます。

javax.servlet.include.request_uri        RequestDispatcher.FORWARD_REQUEST_URI
javax.servlet.include.context_path       RequestDispatcher.FORWARD_CONTEXT_PATH
javax.servlet.include.servlet_path       RequestDispatcher.FORWARD_SERVLET_PATH
javax.servlet.include.path_info          RequestDispatcher.FORWARD_PATH_INFO
javax.servlet.include.query_string       RequestDispatcher.FORWARD_QUERY_STRING
0
winter