복붙노트

[SPRING] 봄 부팅 단일 페이지 응용 프로그램 - index.html에 대한 모든 요청 전달

SPRING

봄 부팅 단일 페이지 응용 프로그램 - index.html에 대한 모든 요청 전달

Spring Boot (v1.3.6) 단일 페이지 응용 프로그램 (angular2)이 있고 모든 요청을 index.html로 전달하고 싶습니다.

http : // localhost : 8080 / index.html에 대한 요청이 작동하지만 (200 및 i는 index.html을 얻음) http : // localhost : 8080 / home은 (404)가 아닙니다.

Runner.class

@SpringBootApplication
@ComponentScan({"packagea.packageb"})
@EnableAutoConfiguration
public class Runner {

    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext run = SpringApplication.run(Runner.class, args);
    }
}

WebAppConfig.class

@Configuration
@EnableScheduling
@EnableAsync
public class WebAppConfig extends WebMvcConfigurationSupport {

    private static final int CACHE_PERIOD_ONE_YEAR = 31536000;

    private static final int CACHE_PERIOD_NO_CACHE = 0;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.setOrder(-1);
        registry.addResourceHandler("/styles.css").addResourceLocations("/styles.css").setCachePeriod(CACHE_PERIOD_ONE_YEAR);
        registry.addResourceHandler("/app/third-party/**").addResourceLocations("/node_modules/").setCachePeriod(CACHE_PERIOD_ONE_YEAR);
        registry.addResourceHandler("/app/**").addResourceLocations("/app/").setCachePeriod(CACHE_PERIOD_NO_CACHE);
        registry.addResourceHandler("/systemjs.config.js").addResourceLocations("/systemjs.config.js").setCachePeriod(CACHE_PERIOD_NO_CACHE);
        registry.addResourceHandler("/**").addResourceLocations("/index.html").setCachePeriod(CACHE_PERIOD_NO_CACHE);
    }

}

styles.css, /app/third-party/xyz/xyz.js, ..가 작동하고 있습니다 (200 및 올바른 파일을 가져옵니다). / **에서 index.html까지만 작동하지 않습니다.

해결법

  1. ==============================

    1.다음과 같은 포워딩 컨트롤러를 추가 할 수도 있습니다.

    다음과 같은 포워딩 컨트롤러를 추가 할 수도 있습니다.

    @Controller
    public class ForwardingController {
        @RequestMapping("/{path:[^\\.]+}/**")
        public String forward() {
            return "forward:/";
        }
    }
    

    첫 번째 부분 {path : [^ \\.] +}은 하나 이상의 다른 문자와 일치합니다. 이렇게하면 file.ext에 대한 요청이이 RequestMapping에 의해 처리되지 않습니다. 하위 경로가 전달되도록 지원해야하는 경우 / **를 {...} 외부에 배치하십시오.

  2. ==============================

    2.로그를 보지 않고서는 왜 제대로 매핑되지 않는지 잘 모르겠다. 그러나 URL을 뷰 (HTML)로 매핑하려면 viewController를 사용하는 것이 더 나을 것이다. 스프링은 http : //docs.spring을 제공한다. .io / spring / docs / 3.2.x / spring-framework-reference / html / mvc.html # mvc-config-view-controller. 예 :

    로그를 보지 않고서는 왜 제대로 매핑되지 않는지 잘 모르겠다. 그러나 URL을 뷰 (HTML)로 매핑하려면 viewController를 사용하는 것이 더 나을 것이다. 스프링은 http : //docs.spring을 제공한다. .io / spring / docs / 3.2.x / spring-framework-reference / html / mvc.html # mvc-config-view-controller. 예 :

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
    
      @Override
      public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
      }
    
    }
    

    위에서 링크 된 스프링 문서에서 가져온 것입니다. 정적 리소스에 대한 매핑을 다시 작성하는 대신 URL을 뷰에 매핑하는 방법입니다.

    리소스 매핑에 대해 필터링하는 접미사가 있는지 확실하지 않습니다. 예 : Spring이 요청을 ResourceHttpRequestHandler에 매핑하는 방법을 결정하지 못했습니다. http : // localhost : 8080 / home.html과 같은 것이 있는지 여부를 확인하거나 거부하려고 시도 했습니까?

    위에서 정의한 html 매핑이 무시되고 index.html이 Spring-Boot의 기본 홈페이지 동작으로 인해 작동 할 수도 있습니다. https://github.com/spring-projects/spring-boot/blob /master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ResourceProperties.java#L108

  3. ==============================

    3.나는 똑같은 문제가 있었고 다음은 나를 위해 일했다. 내 HTML 파일은 src / main / resources / static / app 안에 있습니다.

    나는 똑같은 문제가 있었고 다음은 나를 위해 일했다. 내 HTML 파일은 src / main / resources / static / app 안에 있습니다.

    핵심은 @EnableWebMvc를 제거하고 addResourceLocations에 "classpath : / static / app /"를 추가하는 것이 었습니다! 희망이 도움이됩니다.

    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
            "classpath:/META-INF/resources/", "classpath:/resources/",
            "classpath:/static/","classpath:/static/app/", "classpath:/public/" };
    
    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurerAdapter() {
    
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                if (!registry.hasMappingForPattern("/webjars/**")) {
                    registry.addResourceHandler("/webjars/**").addResourceLocations(
                            "classpath:/META-INF/resources/webjars/");
                }
                if (!registry.hasMappingForPattern("/**")) {
                    registry.addResourceHandler("/**").addResourceLocations(
                            CLASSPATH_RESOURCE_LOCATIONS);
                }
            }
    
    
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                // forward requests to /admin and /user to their index.html
                registry.addViewController("/portal").setViewName(
                        "forward:/app/index.html");
            }
        };
    }
    
  4. ==============================

    4.이것은 나를 위해 작동하지 않았다 :

    이것은 나를 위해 작동하지 않았다 :

    return "forward:/";
    

    스프링 MVC @RestController와 리다이렉 덕분에 나는 잘 작동하는 솔루션을 발견했다 :

    @RequestMapping(value = "/{[path:[^\\.]*}")
    public void redirect(HttpServletResponse response) throws IOException {
        response.sendRedirect("/");
    }
    
  5. from https://stackoverflow.com/questions/38783773/spring-boot-single-page-application-forward-every-request-to-index-html by cc-by-sa and MIT license