Spring Cloud Zuul: перенаправление RedirectView на службу, а не на шлюз

Я немного новичок в микросервисах и Spring. У меня есть микросервисы Spring Cloud (порты: 8xxx-8xxx) со шлюзом Zuul, работающим на порту 9000. Внутри контроллера службы пользовательского интерфейса есть метод, который должен выполнить вход в систему, а затем вернуться на страницу index.html:

@RequestMapping(value="/do-login", method = RequestMethod.POST)
    public RedirectView doLogin (@ModelAttribute("authEntity") final AuthEntity authEntity, final Model model) {
        model.addAttribute(VERSION, applicationVersion);
        model.addAttribute("authEntity", new AuthEntity());
        authenticatedStatus = true;
        model.addAttribute(AUTHENTICATED, authenticatedStatus);

        return new RedirectView("index");
    }

Проблема в том, что когда вышеуказанный метод завершается, он возвращает URL-адрес самого микросервиса localhost:8888/index, но не localhost:9000/services/ui/.

Если я использую более простой метод:

@RequestMapping(value="/do-login", method = RequestMethod.POST)
public String doLogin (@ModelAttribute("authEntity") final AuthEntity authEntity, final Model model) {
    model.addAttribute(VERSION, applicationVersion);
    model.addAttribute("authEntity", new AuthEntity());
    authenticatedStatus = true;
    model.addAttribute(AUTHENTICATED, authenticatedStatus);

    return "index";
}

Это правильно возвращает URL-адрес шлюза localhost:9000/services/ui/do-login, но с /do-login, который мне не нужен.

Может быть, я могу избавиться от /do-login/ части URL? А может быть есть решение для некорректного редиректа?

Заранее спасибо!


person Deniss M.    schedule 18.05.2017    source источник


Ответы (2)


Если вы используете относительный путь, как в return "index";, результат запроса POST, отправленного на http://localhost:9000/services/ui/do-login, будет включать URL-адреса на http://localhost:9000/..., если иное не закодировано в файле jsp/freemarker/thymeleaf.

Если вы хотите избавиться от do-login, вам нужно реализовать то, что называется перенаправлением после публикации (или перенаправлением после отправки формы), чтобы при обновлении страницы форма не отправлялась повторно. Если вы выберете этот подход, который кажется тем, что вы делали при использовании: return new RedirectView("index");, я могу придумать пару способов исправить URL-адрес и установить его для прокси-хоста.

1) http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/view/RedirectView.html, есть пара конструкторов, которые принимают хост параметр, вам нужно будет внедрить прокси-хост в класс контроллера и, скорее всего, в каждый класс контроллера, который реализует перенаправление после публикации.

2) http://tuckey.org/urlrewrite/, включите фильтр UrlRewriteFilter и настройте правила для перезаписи с узла веб-приложения. на прокси-хост, когда ответ с кодом состояния http веб-приложения равен 302. При таком подходе это будет только одно правило, и нет необходимости вводить прокси-хост в классы контроллера или изменять возвращаемый новый RedirectView("index");`

3) Возможно, это переписывание реализовано в Zuul и вам не нужно включать и настраивать UrlRewriteFilter как предложено в 2).

В качестве примечания: в прошлом я настроил proxy_pass Nginx для веб-приложений Java (где я реализовал Redirect After Post) и не помню, чтобы у меня была эта проблема. Придется взглянуть на файлы конфигурации UrlRewriteFilter и Nginx, чтобы расширить это.

person ootero    schedule 18.05.2017

Я обнаружил, что это (спасибо за ответ здесь: Проблема URL-адреса перенаправления Spring, когда за прокси-сервером Zuul), кажется, работает должным образом (но считается «обходным путем»):

@RequestMapping(value="/do-login", method = RequestMethod.POST)
    public void doLogin (@ModelAttribute("authEntity") final AuthEntity authEntity,
                         final Model model,
                         HttpServletResponse servletResponse) throws IOException {
        ...

        String rUrl = ServletUriComponentsBuilder.fromCurrentContextPath().path("/").build().toUriString();
        servletResponse.sendRedirect(rUrl);
    }
person Deniss M.    schedule 19.05.2017