Получить 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

Ответ 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), поскольку он уже содержит только схему, хост и порт.