Как найти базовый URL текущего веб-приложения в Spring? - PullRequest
17 голосов
/ 25 июля 2011

Я бы хотел найти абсолютный URL веб-приложения в 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" и не мог найти способ решить эту проблему.

Ответы [ 2 ]

29 голосов
/ 25 июля 2011

Я думаю, что получение абсолютного 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.

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

PS В любом случае, разбор URL во время выполнения не выглядит для меня хорошей идеей.

10 голосов
/ 30 ноября 2012

Очень поздно к этому ответу, но вариант ответа Бориса, если вы не хотите помещать объекты сервлета в сигнатуры методов, - это использовать 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

...