Java HttpServletRequest получить URL в адресной строке браузера - PullRequest
24 голосов
/ 10 августа 2009

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

Пример: \ AdvancedSearch:
getRequestURI() возвращает "\ subdir \ search \ search.jsp"

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

Ответы [ 6 ]

40 голосов
/ 10 августа 2009

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

Для <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-адрес запроса.

8 голосов
/ 06 августа 2012

Просто сделал небольшую уборку решения от 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();
}

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

5 голосов
/ 12 августа 2009
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 голосов
/ 22 июня 2012

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

1 голос
/ 27 ноября 2015

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

public String getUri(HttpServletRequest request) {
    String r = (String) request.getAttribute("javax.servlet.forward.request_uri");
    return r == null ? request.getRequestURI() : r;
}
1 голос
/ 21 июля 2015

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

<%=request.getRequestURL().toString()%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...