Java HttpServletRequest получает URL-адрес в браузере URL-адрес

Итак, я пытаюсь захватить текущий URL-адрес страницы с помощью объекта запроса Java. Я использовал request.getRequestURI(), чтобы преформировать это, но я заметил, что когда класс java перенаправляет меня на другую страницу с запросом сервлета, getRequestURI дает этот адрес в отличие от исходного URL, который был введен в браузере и который по-прежнему отображается в браузере.

Пример:\Расширенный поиск:
getRequestURI() возвращает "\ subdir\search\search.jsp"

Я ищу способ захватить то, что браузер видит как URL, а не то, что знает эта страница, - это только оболочка сервлета.

Ответ 1

Если ваш текущий запрос поступает из "внутри приложения-сервера" вперед или включен, ожидается, что приложение-сервер сохранит информацию запроса в качестве атрибутов запроса. Конкретные атрибуты и то, что они содержат, зависят от того, выполняете ли вы форвард или включите.

Для <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 и 8.4 спецификации Servlet 2.4.

Однако имейте в виду, что эта информация сохраняется только для внутренних запросов. Если у вас есть интерфейсный веб-сервер или отправка за пределы текущего контейнера, эти значения будут равны нулю. Другими словами, у вас может не найти исходный URL-адрес запроса.

Ответ 2

Просто слегка опроверг решение 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();
}

Нулевые проверки будут выполняться намного эффективнее, чем сравнение строк.

Ответ 3

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;

Ответ 4

${requestScope [ 'javax.servlet.forward.query_string']}  - если вы обращаетесь к нему через форму jsp, используя язык выражений

Ответ 5

Можете ли вы попробовать это

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

Ответ 6

Чтобы получить запрошенный путь HTTP, не зная состояния внутреннего потока запроса, используйте этот метод:

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

Ответ 7

Ответ тот же, что и у @kdgregory, но вы можете использовать константы диспетчера запросов.

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