Как получить URL-адрес домена и имя приложения?
Вопрос
Вот сценарий.
Мое веб-приложение 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 перебирает все доступные методы:
Я настоятельно рекомендую вам прочитать документы, для подобных методов.Если вас интересует контекстный путь, посмотрите здесь, СервлетКонтекст.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")