У меня есть веб-приложение, составленное из кода внешнего интерфейса, который вызывает тот же API, реализованный двумя внутренними модулями. Этот API-интерфейс возвращает URL-адрес в объекте JSON. Бэкэнд-модули написаны с использованием Spring mvc, но в разных версиях.
URL-адрес здания такой же, и он выглядит примерно так:
@GetMapping(path = "/app1/menu", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public JsonObject getMenu(HttpServletRequest req) throws IOException {
JsonObject menu = new JsonObject();
menu.addProperty("href", ServletUriComponentsBuilder.fromRequest(req)
.replacePath(req.getContextPath())
.path("/index.html")
.toUriString());
return menu;
}
Как видите, этот код просто добавляет константу во входящий запрос и возвращает его.
Первое приложение использует Spring MVC 4 (точно 4.3.5. ВЫПУСК).
Второй модуль использует версию 5.1.4.RELEASE.
Когда все эти приложения развернуты на сервере с балансировкой нагрузки (2 экземпляра tomcat с предварительным балансировщиком нагрузки) и https, проблема обнаруживается.
Скажем, что URL-адрес запроса для app1 выглядит примерно так:
https://example.com/context/app1/menu
Приложение 1 возвращается правильно
https://example.com/context/index.html
Для app2 запрос от внешнего интерфейса
https://example.com/context/app2/menu
И ответ
http://example.com/context/another_index.html
Так что он теряет схему https
Похоже, что ServletUriComponentsBuilder.fromRequest изменил поведение?
Я быстро взглянул на коммиты в git-репо, но не стал
нашел что-нибудь ....