Получить Root/Base Url In Spring MVC
Каков наилучший способ получить корневой/базовый URL-адрес веб-приложения в Spring MVC?
Base Url = http://www.example.com или http://www.example.com/VirtualDirectory
Ответы
Ответ 1
Если базовый url "http://www.example.com", используйте следующую команду, чтобы получить часть "www.example.com" без "http://":
От контроллера:
@RequestMapping(value = "/someURL", method = RequestMethod.GET)
public ModelAndView doSomething(HttpServletRequest request) throws IOException{
//Try this:
request.getLocalName();
// or this
request.getLocalAddr();
}
От JSP:
Объявите это в верхней части документа:
<c:set var="baseURL" value="${pageContext.request.localName}"/> //or ".localAddr"
Затем, чтобы использовать его, укажите переменную:
<a href="http://${baseURL}">Go Home</a>
Ответ 2
Вы также можете создать свой собственный метод для его получения:
public String getURLBase(HttpServletRequest request) throws MalformedURLException {
URL requestURL = new URL(request.getRequestURL().toString());
String port = requestURL.getPort() == -1 ? "" : ":" + requestURL.getPort();
return requestURL.getProtocol() + "://" + requestURL.getHost() + port;
}
Ответ 3
request.getRequestURL(). toString(). replace (request.getRequestURI(), request.getContextPath())
Ответ 4
Я предпочитаю использовать
final String baseUrl = ServletUriComponentsBuilder.fromCurrentContextPath().build().toUriString();
Он возвращает полностью построенный URL, схему, имя сервера и порт сервера, а не объединяет и заменяет строки, которые подвержены ошибкам.
Ответ 5
В контроллере используйте HttpServletRequest.getContextPath()
.
В JSP используйте библиотеку тегов Spring: или jstl
Ответ 6
Либо введите UriCompoenentsBuilder
:
@RequestMapping(yaddie yadda)
public void doit(UriComponentBuilder b) {
//b is pre-populated with context URI here
}
. Или сделайте это самостоятельно (похоже на ответ Салимса):
// Get full URL (http://user:[email protected]/root/some?k=v#hey)
URI requestUri = new URI(req.getRequestURL().toString());
// and strip last parts (http://user:[email protected]/root)
URI contextUri = new URI(requestUri.getScheme(),
requestUri.getAuthority(),
req.getContextPath(),
null,
null);
Затем вы можете использовать UriComponentsBuilder из этого URI:
// http://user:[email protected]/root/some/other/14
URI complete = UriComponentsBuilder.fromUri(contextUri)
.path("/some/other/{id}")
.buildAndExpand(14)
.toUri();
Ответ 7
Просто:
String getBaseUrl(HttpServletRequest req) {
return req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath();
}
Ответ 8
@RequestMapping(value="/myMapping",method = RequestMethod.POST)
public ModelandView myAction(HttpServletRequest request){
//then follow this answer to get your Root url
}
Корень URl сервлета
Если вам это нужно в jsp, войдите в контроллер и добавьте его в качестве объекта в ModelAndView.
В качестве альтернативы, если вам это нужно на стороне клиента, используйте javascript для его получения:
http://www.gotknowhow.com/articles/how-to-get-the-base-url-with-javascript
Ответ 9
Я думаю, что ответ на этот вопрос: Поиск URL вашего приложения только с ServletContext показывает, почему вы должны использовать относительный URL вместо этого, если у вас нет особых причин для желая корневого URL.
Ответ 10
В JSP
<c:set var="scheme" value="${pageContext.request.scheme}"/>
<c:set var="serverPort" value="${pageContext.request.serverPort}"/>
<c:set var="port" value=":${serverPort}"/>
<a href="${scheme}://${pageContext.request.serverName}${port}">base url</a>
ссылка https://github.com/spring-projects/greenhouse/blob/master/src/main/webapp/WEB-INF/tags/urls/absoluteUrl.tag
Ответ 11
Объяснение
Я знаю, что этот вопрос довольно старый, но это единственный вопрос, который я нашел по этой теме, поэтому я хотел бы поделиться своим подходом для будущих посетителей.
Если вы хотите получить базовый URL из WebRequest, вы можете сделать следующее:
ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request);
Это даст вам схему ("http" или "https"), хост ("example.com"), порт ("8080") и путь ("/some/path"), а fromRequest(request)
даст вам параметры запроса, а также. Но поскольку мы хотим получить только базовый URL (схема, хост, порт), нам не нужны параметры запроса.
Теперь вы можете просто удалить путь следующей строкой:
ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request).replacePath(null);
TLDR
Наконец, наш однострочник для получения базового URL будет выглядеть так:
//request URL: "http://example.com:8080/some/path?someParam=42"
String baseUrl = ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request)
.replacePath(null)
.build()
.toUriString();
//baseUrl: "http://example.com:8080"
Добавление
Если вы хотите использовать это вне контроллера или где-то еще, где у вас нет HttpServletRequest
, вы можете просто заменить
ServletUriComponentsBuilder.fromRequestUri(HttpServletRequest request).replacePath(null)
с
ServletUriComponentsBuilder.fromCurrentContextPath()
Это позволит получить HttpServletRequest
через пружину RequestContextHolder
. Вам также не понадобится replacePath(null)
, поскольку он уже содержит только схему, хост и порт.