programing

스프링 부팅 시 폴더 요청이 "index.html" 파일에 매핑되지 않음

newstyles 2023. 3. 5. 09:38

스프링 부팅 시 폴더 요청이 "index.html" 파일에 매핑되지 않음

나는 가지고 있다static다음 구조의 폴더:

index.displaces를 표시합니다.
docs/index.docs

Spring Boot가 요구를 올바르게 매핑합니다./로.index.html하지만 지도는 안 나와/docs/에 요청하다/docs/index.html(/docs/index.html올바르게 동작합니다).

폴더/서브폴더 요청을 적절하게 매핑하는 방법index.html파일?

뷰 컨트롤러 매핑을 수동으로 추가하여 다음 작업을 수행할 수 있습니다.

@Configuration
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/docs").setViewName("redirect:/docs/");
        registry.addViewController("/docs/").setViewName("forward:/docs/index.html");
    super.addViewControllers(registry);
    }
}

첫 번째 매핑은 Spring MVC가 클라이언트에 리다이렉트를 송신하는 원인이 됩니다./docs(후행 슬래시 없음)가 요구됩니다.이것은 에 상대적인 링크가 있는 경우에 필요합니다./docs/index.html두 번째 매핑은 모든 요구를 에 전송합니다./docs/(클라이언트에 리다이렉트를 송신하지 않고) 내부적으로index.html에서docs서브 디렉토리

Java 8이 인터페이스에 디폴트메서드를 도입한 후WebMvcConfigurerAdapter는 Spring 5 / Spring Boot 2에서 폐지되었습니다.

이제 이 명령을 사용하면 경고가 표시됩니다.

WebMvcConfigurerAdapter 유형은 사용되지 않습니다.

따라서 @hzz의 솔루션을 다시 작동시키려면 다음과 같이 변경해야 합니다.

@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/docs").setViewName("redirect:/docs/");
        registry.addViewController("/docs/").setViewName("forward:/docs/index.html");
    }
}

index.html에 대한 Spring Boot 매핑이 아니라 서블릿 엔진입니다(환영 페이지입니다).(스펙에 따라) 시작 페이지는 1개뿐이며, 디렉토리 브라우징은 컨테이너의 기능이 아닙니다.

이것은 항상 일치하려고 할 것이다.requestPath + /index.html정적 리소스를 찾을 수 없는 경우:

import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.io.Resource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.resource.PathResourceResolver;
import org.springframework.web.servlet.resource.ResourceResolverChain;

@Configuration
public class ResourceHandlerConfig implements WebMvcConfigurer {

  static class IndexFallbackResourceResolver extends PathResourceResolver{
    @Override
    protected Resource resolveResourceInternal(HttpServletRequest request, String requestPath,
        List<? extends Resource> locations, ResourceResolverChain chain) {
      Resource resource = super.resolveResourceInternal(request, requestPath, locations, chain);
      if(resource==null){
        //try with /index.html
        resource = super.resolveResourceInternal(request, requestPath + "/index.html", locations, chain);
      }
      return resource;
    }
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry
        .setOrder(Ordered.LOWEST_PRECEDENCE)
        .addResourceHandler("/**")
        .addResourceLocations("classpath:/static/")
        //first time resolved, that route will always be used from cache
        .resourceChain(true)
        .addResolver(new IndexFallbackResourceResolver());
  }
}

기본적으로는 스프링부트 show index.html 입니다.

그러나 index.displaces는 /resource/static 또는 /public이어야 합니다.

예:

https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples/spring-boot-sample-web-static

언급URL : https://stackoverflow.com/questions/28437314/spring-boot-doesnt-map-folder-requests-to-index-html-files