Получить URL-адрес запроса в JSP, который перенаправляется Servlet
Как получить URL-адрес запроса в JSP, который перенаправляется Servlet?
Если я запускаю следующий код в JSP,
System.out.println("servlet path= " + request.getServletPath());
System.out.println("request URL= " + request.getRequestURL());
System.out.println("request URI= " + request.getRequestURI());
то я получаю путь на стороне сервера к JSP. Но я хочу получить URL-адрес, как вы можете видеть в адресной строке браузера. Я могу получить его в Servlet, который пересылает JSP, но я хочу получить его в JSP.
Ответы
Ответ 1
Если вы используете RequestDispatcher.forward()
для маршрутизации запроса от контроллера к представлению, тогда запрос URI открывается как атрибут запроса с именем javax.servlet.forward.request_uri
. Таким образом, вы можете использовать
request.getAttribute("javax.servlet.forward.request_uri")
или
${requestScope['javax.servlet.forward.request_uri']}
Ответ 2
Попробуйте вместо этого:
String scheme = req.getScheme();
String serverName = req.getServerName();
int serverPort = req.getServerPort();
String uri = (String) req.getAttribute("javax.servlet.forward.request_uri");
String prmstr = (String) req.getAttribute("javax.servlet.forward.query_string");
String url = scheme + "://" +serverName + ":" + serverPort + uri + "?" + prmstr;
Примечание. Вы не можете получить привязку HREF от своего URL-адреса. Например, если у вас есть url "toc.html # top", вы можете получить только "toc.html"
Примечание: req.getAttribute( "javax.servlet.forward.request_uri" ) работает только в JSP. если вы запускаете это в контроллере перед JSP, тогда результат будет null
Вы можете использовать код для обоих вариантов:
public static String getCurrentUrl(HttpServletRequest req) {
String url = getCurrentUrlWithoutParams(req);
String prmstr = getCurrentUrlParams(req);
url += "?" + prmstr;
return url;
}
public static String getCurrentUrlParams(HttpServletRequest request) {
return StringUtil.safeString(request.getQueryString());
}
public static String getCurrentUrlWithoutParams(HttpServletRequest request) {
String uri = (String) request.getAttribute("javax.servlet.forward.request_uri");
if (uri == null) {
return request.getRequestURL().toString();
}
String scheme = request.getScheme();
String serverName = request.getServerName();
int serverPort = request.getServerPort();
String url = scheme + "://" + serverName + ":" + serverPort + uri;
return url;
}
Ответ 3
Чтобы получить текущий путь из JSP файла, вы можете просто выполнить одно из следующих действий:
<%= request.getContextPath() %>
<%= request.getRequestURI() %>
<%= request.getRequestURL() %>
Ответ 4
Попробуйте это,
<c:set var="pageUrl" scope="request">
<c:out value="${pageContext.request.scheme}://${pageContext.request.serverName}"/>
<c:if test="${pageContext.request.serverPort != '80'}">
<c:out value=":${pageContext.request.serverPort}"/>
</c:if>
<c:out value="${requestScope['javax.servlet.forward.request_uri']}"/>
</c:set>
Я хотел бы поместить его в свой базовый шаблон и использовать все приложение, когда мне нужно.
Ответ 5
Ни один из этих атрибутов не является надежным, поскольку в отношении спецификации сервлета (2.4, 2.5 и 3.0) эти атрибуты переопределяются, если вы включаете/пересылаете второй раз (или если кто-то вызывает getNamedDispatcher). Я думаю, что единственный надежный способ получить исходный запрос URI/строку запроса - вставить фильтр в начале вашей цепочки фильтров в web.xml, который устанавливает ваши собственные пользовательские атрибуты запроса на основе request.getRequestURI()/getQueryString() до любые форварды/включенные.
http://www.caucho.com/resin-3.0/webapp/faq.xtp содержит прекрасное резюме того, как это работает (минус техническая нота, что вторая перемотка вперед/включение испортила вашу способность использовать эти атрибуты).
Ответ 6
Также вы можете использовать
${pageContext.request.requestURI}
Ответ 7
Чтобы избежать использования скриптов в jsp, следуйте советам "divideByZero" и используйте
${pageContext.request.requestURI}
Это лучший способ пойти.
Ответ 8
То же, что и @axtavt, но вы также можете использовать константу RequestDispatcher.
request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI);