[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.다음과 같은 포워딩 컨트롤러를 추가 할 수도 있습니다.
다음과 같은 포워딩 컨트롤러를 추가 할 수도 있습니다.
@Controller public class ForwardingController { @RequestMapping("/{path:[^\\.]+}/**") public String forward() { return "forward:/"; } }
첫 번째 부분 {path : [^ \\.] +}은 하나 이상의 다른 문자와 일치합니다. 이렇게하면 file.ext에 대한 요청이이 RequestMapping에 의해 처리되지 않습니다. 하위 경로가 전달되도록 지원해야하는 경우 / **를 {...} 외부에 배치하십시오.
-
==============================
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.나는 똑같은 문제가 있었고 다음은 나를 위해 일했다. 내 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.이것은 나를 위해 작동하지 않았다 :
이것은 나를 위해 작동하지 않았다 :
return "forward:/";
스프링 MVC @RestController와 리다이렉 덕분에 나는 잘 작동하는 솔루션을 발견했다 :
@RequestMapping(value = "/{[path:[^\\.]*}") public void redirect(HttpServletResponse response) throws IOException { response.sendRedirect("/"); }
from https://stackoverflow.com/questions/38783773/spring-boot-single-page-application-forward-every-request-to-index-html by cc-by-sa and MIT license