Как найти базовый URL-адрес текущего webapp в Spring?

Я хочу найти абсолютный URL-адрес webapp в Spring, с помощью контроллера. Я знаю JSTL c: url, но мне нужна эта информация внутри контроллера.

@Controller
public class AuthorizeController {

    @Autowired
    private Authorizer auth;

    @RequestMapping("/auth")
    public String sendToAuthorization() {        
        String baseUrl = "http://localhost:8080/tasks/";
        return "redirect:" +  auth.getAuthorizationUrl(baseUrl);
    }

}

Как вы можете видеть, что baseUrl жестко запрограммирован, и я мог бы предоставить его классу Authorizer через конфигурацию Spring, но я уверен, что можно получить эту информацию из Spring в контроллере. Я попытался google "spring mvc url" и не смог найти способ решить эту проблему.

Ответы

Ответ 1

Я думаю, что получение абсолютного url возможно только при обработке запроса, так как у вашего сервера может быть много IP-адресов и доменных имен.

 @RequestMapping("/auth")
    public String sendToAuthorization(HttpServletRequest request) {        
    String baseUrl = String.format("%s://%s:%d/tasks/",request.getScheme(),  request.getServerName(), request.getServerPort());


        return "redirect:" +  auth.getAuthorizationUrl(baseUrl);
    }

Что касается сервлета, он также может иметь несколько отображений в web.xml.

аналогичный вопрос

P.S. Во всяком случае, синтаксический анализ URL во время выполнения для меня не похож.

Ответ 2

Очень поздно, но вариант для ответа Бориса, если вы не хотите подталкивать объекты сервлета в сигнатуры методов, заключается в использовании RequestContextHolder из служебного класса/метода. Это также даст возможность абстрагировать логику возврата (например, вытаскивание из файла свойств). Пример сыра:

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if(null != requestAttributes && requestAttributes instanceof ServletRequestAttributes) {
  HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
  // build URL from request
}
else {
  // fallback logic if request won't work...
}

Это предполагает, что org.springframework.web.context.request.RequestContextListener зарегистрирован как слушатель в web.xml