Как найти базовый 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