Проблема RequestMapping с несколькими клиентами Angular в Spring Boot Application - PullRequest
0 голосов
/ 18 января 2019

Мне нужно обработать некоторые запросы GET для пересылки нескольким клиентам Angular.

https://example.com/web/index.html    // Client 1
https://example.com/admin/index.html  // Client 2

Так как я не хочу использовать фрагментированные (# -ed) пути для /web вещей, которые довольно раздражают.

Это мой текущий не работает решение:

@Controller
public class ForwardController {

    @RequestMapping(value = "/*", method = RequestMethod.GET)
    public String redirectRoot(HttpServletRequest request) {

        String req = request.getRequestURI();

        if (req.startsWith("/admin/")) {
            return this.redirectAdminTool(request);
        }

        return "forward:/web/index.html";
    }

    @RequestMapping(value = "/web/{path:[^.]*}", method = RequestMethod.GET)
    public String redirectWeb(HttpServletRequest request) {
        return "forward:/web/index.html";
    }

    @RequestMapping(value = "/admin/{path:[^.]*}", method = RequestMethod.GET)
    public String redirectAdminTool(HttpServletRequest request) {
        return "forward:/admin/index.html";
    }
}

При этом доступ к работе, например,

  • /web/pricing

но не работает доступ к

  • /web/pricing/vienna

Я могу получить доступ к /web/pricing через браузер, нажать « refresh » и все будет работать. Но это не для /web/pricing/vienna.

Теперь я не могу понять, как обрабатывать запросы и как их переадресовывать, чтобы заставить работать также вспомогательные пути, такие как /web/pricing/vienna.

Можно ли как-нибудь сделать эту работу?

Если я изменю путь @RequestMapping на что-то вроде /web/**, все закончится бесконечным циклом и сломает сервер.


Мне, вероятно, нужно выражение, подобное этому:

/web(/[^\\.]*)

, что приведет к

MATCH:    /web/pricing
MATCH:    /web/specials/city
MATCH:    /web/specials/city/street
NO MATCH: /web/index.html

Однако Spring не любит это регулярное выражение: /web(/[^\\.]*)

В конце концов, эта проблема сводится к тому, чтобы найти способ сопоставлять все значения, кроме статических ресурсов ниже /web.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вот что я в итоге сделал:

Я переместил обоих клиентов в подкаталог a/:

static/a/web
static/a/admin

Далее я реализовал ForwardController так:

@Controller
public class ForwardController {

    @RequestMapping(value = "/*", method = RequestMethod.GET)
    public String redirectRoot(HttpServletRequest request) {
        return "forward:/a/web/index.html";
    }

    @RequestMapping(value = "/a/**/{path:[^.]*}", method = RequestMethod.GET)
    public String redirectClients(HttpServletRequest request) {

        String requestURI = request.getRequestURI();

        if (requestURI.startsWith("/a/admin/")) {
            return "forward:/a/admin/index.html";
        }

        return "forward:/a/web/index.html";
    }

}
0 голосов
/ 19 января 2019

Дочерние маршруты не будут работать, потому что главный индекс должен быть загружен раньше, чтобы получить все маршруты.Обходной путь - перенаправлять на главный индекс каждый раз, когда серверная часть не находит путь:

@Controller
@RequestMapping("/error")
public class ErrorHandlerController extends AbstractErrorController {

private static final String ROOT_PATH = "/";

public ErrorHandlerController(ErrorAttributes errorAttributes) {
    super(errorAttributes);
}

@RequestMapping
public void errorHtml(HttpServletRequest request,
        HttpServletResponse response) throws IOException {
    if(HttpStatus.NOT_FOUND.equals(getStatus(request))) {
        response.sendRedirect(ROOT_PATH);
    }
}

@Override
public String getErrorPath() {
    return "error";
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...