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

StackOverflow https://stackoverflow.com/questions/2204870

  •  18-09-2019
  •  | 
  •  

Вопрос

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

Мое веб-приложение 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»?

Это было полезно?

Решение

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

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

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

<%@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> так что вам не нужно везде копировать контекстный путь.Обратите внимание: если относительные ссылки начинаются с /, то они не будут относительно <base> больше, но вместо этого к корню домена.

Другие советы

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

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

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

public static String getURLWithContextPath(HttpServletRequest request) {
   return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}

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

Я нахожу эту графику из Мастерство гибкого программного обеспечения Декодирование пути HttpServletRequest перебирает все доступные методы:

enter image description here

Я настоятельно рекомендую вам прочитать документы, для подобных методов.Если вас интересует контекстный путь, посмотрите здесь, СервлетКонтекст.getContextPath().

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

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

newURL = newURL.substring(0,newURL.indexOf(""));

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

url.replaceAll("^(.*\\/\\/)?.*?\\/(.+?)\\/.*|\\/(.+)$", "$2$3")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top