programing

스프링 부트 단일 페이지 응용 프로그램 - 모든 요청을 index.html로 전송합니다.

bestprogram 2023. 3. 18. 09:31

스프링 부트 단일 페이지 응용 프로그램 - 모든 요청을 index.html로 전송합니다.

Spring Boot(v1.3.6) 싱글 페이지 애플리케이션(angular2)을 사용하고 있으며 모든 요청을index.html.

http://localhost:8080/index.html에 대한 요구는 동작하고 있지만(200으로 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동작하지 않습니다.

다음과 같이 전송 컨트롤러를 추가할 수도 있습니다.

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

첫 번째 부분{path:[^\\.]+}1개 또는 여러 개의 문자와 일치합니다...이것에 의해, 확실히 요구됩니다.file.ext는 이 RequestMapping에서 처리되지 않습니다.서브패스 전송도 지원해야 하는 경우/**을 벗어나서{...}.

이건 나한테 안 통했어

return "forward:/";

Spring MVC @RestController 및 리다이렉트 덕분에 제대로 작동하는 솔루션을 찾을 수 있었습니다.

@RequestMapping(value = "/{[path:[^\\.]*}")
public void redirect(HttpServletResponse response) throws IOException {
    response.sendRedirect("/");
}

로그를 보지 않고는 왜 올바르게 매핑되지 않는지 알 수 없지만 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을 매핑하는 방법입니다).

리소스 매핑에 대한 접미사 필터링이 있는지 잘 모르겠습니다(예:어떻게 봄철에 요청을 매핑할지 모르겠어요.ResourceHttpRequestHandler- http://localhost:8080/home.http:201Amps와 같은 것을 시도(확인 또는 거부)한 적이 있습니까?

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

저도 같은 문제가 있었고, 다음과 같은 문제가 있었습니다.html 파일은 src/main/resources/static/app 내에 있습니다.

중요한 것은 @EnableWebMvc를 삭제하고 "classpath:/static/app/"를 addResourceLocations에 추가하는 것이었습니다.이게 도움이 됐으면 좋겠다.

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");
        }
    };
}

언급URL : https://stackoverflow.com/questions/38783773/spring-boot-single-page-application-forward-every-request-to-index-html