Как получить URL-адрес домена и имя приложения?

98

Вот сценарий.

Мое веб-приложение Java имеет следующий путь

https://www.mywebsite.com:9443/MyWebApp

Допустим, есть файл JSP

https://www.mywebsite.com:9443/MyWebApp/protected/index.jsp

и мне нужно получить

https://www.mywebsite.com:9443/MyWebApp 

в этом файле JSP.

Конечно, есть довольно ленивый и глупый способ просто получить URL-адрес и затем снова проследить путь обратно.

Но есть ли программный способ сделать это? В частности, я думаю, что могу получить домен + порт, но как мне получить имя приложения «MyWebApp»?

Ericbae
источник

Ответы:

91

Имя веб-приложения (фактически путь контекста) доступно по вызову HttpServletrequest#getContextPath()(и, следовательно, НЕ, getServletPath()как предлагалось ранее). Вы можете получить это в JSP с помощью ${pageContext.request.contextPath}.

<p>The context path is: ${pageContext.request.contextPath}.</p>

Если вы намереваетесь использовать это для всех относительных путей на странице JSP (что сделало бы этот вопрос более понятным), то вы можете использовать <base>тег HTML :

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="req" value="${pageContext.request}" />
<c:set var="url">${req.requestURL}</c:set>
<c:set var="uri" value="${req.requestURI}" />

<!doctype html>
<html lang="en">
    <head>
        <title>SO question 2204870</title>
        <base href="${fn:substring(url, 0, fn:length(url) - fn:length(uri))}${req.contextPath}/">
        <script src="js/global.js"></script>
        <link rel="stylesheet" href="css/global.css">
    </head>
    <body>
        <ul>
            <li><a href="home.jsp">Home</a></li>
            <li><a href="faq.jsp">FAQ</a></li>
            <li><a href="contact.jsp">Contact</a></li>
        </ul>
    </body>
</html>

После этого все ссылки на странице будут автоматически относиться к, <base>так что вам не нужно везде копировать путь контекста. Обратите внимание, что когда относительные ссылки начинаются с a /, они будут относиться не к <base>, а к корню домена.

BalusC
источник
В документе говорится: «Контекстный путь, возвращаемый функцией, ServletContext.getContextPath() следует рассматривать как основной или предпочтительный контекстный путь приложения». Это была причина, по которой я включил это в свой первоначальный ответ, осознав это. Я не удалял свою первую попытку, так как хочу, чтобы OP рассмотрел возможность чтения документации и знал немного больше о связанных методах. Надеюсь, вы поняли мою мысль.
Adeel Ansari 05
@Vinegar: для файлов JSP getServletPath()возвращается /filename.jsp. OP вообще не просил об этом, это, конечно, не путь.
BalusC 05
Я бы обязательно внес поправку в свой пост, но на этот раз я ожидал ответа на свой комментарий, который совсем другой :).
Адил Ансари
2
В XHTML DOCTYPE вам нужно будет добавить символ '/' к contextPath. <base href = "$ {pageContext.request.contextPath} /">
Бэзил Муса,
Почему вы не закрыли <base>тег? Не следует ли закрыть все теги?
Фабиано Франческони
107

Взгляните на документацию для HttpServletRequest.
Чтобы создать URL-адрес в вашем примере, вам нужно будет использовать:

  • getScheme()
  • getServerName()
  • getServerPort()
  • getContextPath()

Вот метод, который вернет ваш пример:

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
Джатаро
источник
1
как получить ip, если имя сервера было localhost?
Махмуд Салех
просто небольшое примечание, getScheme () не всегда работает для https, некоторые серверы ведут себя странно и всегда могут возвращать http вместо https. Я подумал, что должен дать тебе знать. попробуйте request.getRequestURL (). toString () и сделайте массаж, если вам нужно
K ''
1
@MahmoudSalehrequest.getLocalAddr()
голубоватый
Будет хорошо, если вы также покажете пример вывода для каждого из методов. Больно запускать и запускать веб-сервер только для того, чтобы проверить, каким может быть результат каждого из них.
Jus12
1
getContextPath()в методе ничего не возвращает! И getServerPort()возвращает только двухзначное число, а не четырехзначное! Могу ли я помочь?
sam
23

Название приложения взято из getContextPath.

Я нахожу этот рисунок из Agile Software Craftsmanship HttpServletRequest Path Decoding сортирует все различные доступные методы:

введите описание изображения здесь

AgilePro
источник
1
Этот рисунок полезен для ответа на многие вопросы. Я пытался использовать его в ответах на многие вопросы, но все они были удалены: существует правило, запрещающее повторное использование одного и того же ответа. Какой позор. Теория заключается в том, что если вы используете один и тот же ответ, то вопросы должны быть одинаковыми, и поэтому вы должны просто пометить вопрос как повторяющийся. Но это не так. Есть много разных вопросов, на которые можно ответить с помощью одного и того же рисунка. Применение таких произвольных правил - малозначительно. Если ВЫ видите вопрос, на который лучше всего ответить с помощью этого рисунка, используйте его.
AgilePro
4

Следующий код может быть полезен для веб-приложения, использующего JavaScript.

var newURL = window.location.protocol + "//"  + window.location.host + "" + window.location.pathname;

newURL = newURL.substring(0,newURL.indexOf(""));
крошечный
источник
0

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

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
master_d
источник