Как получить 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"?

577   6  
jsp

6 ответов:

имя веб-приложения (фактически путь контекста) доступно по вызову 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();
}

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

имя приложения происходит от getContextPath.

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

enter image description here

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

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

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

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

url.replaceAll("^(.*\/\/)?.*?\/(.+?)\/.*|\/(.+)$", "")

Comments

    Ничего не найдено.