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