Spring Boot SPA URL переписать - PullRequest
       6

Spring Boot SPA URL переписать

0 голосов
/ 29 сентября 2019

Я пытаюсь создать SPA-сервер (статический контент-сервер, API) с некоторыми дополнительными функциями / элементами управления, которые требуют гибкой перезаписи / маршрутизации / обработки URL.Эти требования трудно совместить, несмотря на то, что я попробовал подход в некоторых похожих ответах, которые я прочитал здесь.

Что мне нужно сделать:

  1. Служить статическим ресурсам (js, images, css, html и т. Д.) Из пути URL: / assets /
  2. Сохранить этистатические ресурсы в каталоге файловой системы и отображение по указанному выше пути
  3. Для любого запроса статического ресурса, не найденного, вернуть 404
  4. Expose REST API из набора именованных путей URL: / api / и /anotherapi / etc ...
  5. Для всех других запросов вне этих путей URL, используйте /index.htm для начальной загрузки SPA

Пока у меня есть следующее ...

Для API-интерфейсов REST:

@RestController
@RequestMapping(value="/api/**")
public class StateAPIController {

    @RequestMapping(value = {"/api/method1"}, method = RequestMethod.POST)
    @ResponseBody
    public String method1() {
        return "method1...";
    }

    @RequestMapping(value = {"/api/method2"}, method = RequestMethod.POST)
    @ResponseBody
    public String method2() {
        return "method2...";
    }

}

(Работает нормально)

Для рендеринга статических файлов из определенного местоположения файловой системы и сопоставления "/" с "/ index.htm ":

@Configuration
@EnableWebMvc
public class AssetServerConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry
                .addResourceHandler("/")
                .addResourceLocations("file:/some/path/index.htm");
        registry
                .addResourceHandler("/assets/**")
                .addResourceLocations("file:/some/path/assets/");
    }

    @Bean
    public ViewResolver viewResolver() {
        UrlBasedViewResolver viewResolver = new UrlBasedViewResolver();
        viewResolver.setViewClass(InternalResourceView.class);
        return viewResolver;
    }


}

(это работает, но не уверен, если лучший способ решить эту проблему)

Для перенаправления / пересылки любых других запросов (вне этих зарезервированных путей) в" /"(и, следовательно," /index.htm"):

@ControllerAdvice
@RequestMapping(value="/**")
public class AssetServerController {

    @RequestMapping(value = {"/**/{path:[^\\.]*}", "/{path:^(?!/assets/).*}", "/{path:^(?!/api/).*}"}, method = RequestMethod.GET)
    public String index() {
        return "forward:/";
    }

}

(это только частично работает ... и основная проблема, с которой мне нужна помощь)

Итак, вот янеобходимо исключить список путей (/ assets / & / api /), но это становится трудно сделать правильно с фильтром regex / AntPathMatcher в RequestMapping, и имеет оба ложных совпадения (показывая index.htm, когда это не следует делать) и пропускает (показывая 404s, когда он должен показать index.htm).

Из-за вышеизложенного я также не могу правильно обслуживать 404-е, когда ресурс отсутствует по одному из зарезервированных путей (например, ресурсов).

a) Каков наилучший способ приблизиться к этому?Я правильно понял?Есть ли лучший способ?

б) как заставить работать регулярное выражение, так как оно не соответствует нормальным правилам регулярного выражения, и примеры, которые я видел до сих пор, не достигают моей цели ....

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