복붙노트

[SPRING] Spring에서 정적 리소스 (addResourceHandlers 및 컨테이너의 기본 서블릿)를 처리하는 두 가지 방법은 무엇입니까?

SPRING

Spring에서 정적 리소스 (addResourceHandlers 및 컨테이너의 기본 서블릿)를 처리하는 두 가지 방법은 무엇입니까?

나는 봄에 새로운 사람이다. 정적 리소스를 처리 할 때 사용할 수있는 두 가지 옵션이 있음을 확인했습니다.

옵션 1:

Spring의 DispatcherServlet이 "Default Servlet"이되는 아래의 코드와 매핑된다면, RequestMapping 주석을 가진 Spring 핸들러에 AbstractAnnotationConfigDispatcherServletInitializer 클래스를 오버라이드 할 수 있습니다.

@Override
protected String[] getServletMappings() {
    return new String[]{"/"};
}

그런 다음 컨테이너의 "기본 서블릿"이 URL 패턴이 Spring 요청 매핑 (WebMvcConfigurerAdapter 클래스 무시)에 의해 다루어지지 않는 정적 리소스를 처리하도록 할 수 있습니다.

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
}

이것은 기본적으로 서블릿 컨테이너의 "Default Servlet"을 캐치 올 (catch-all)로 사용하여 Spring의 DispatcherServlet이 놓친 모든 정적 리소스를 처리합니다.

옵션 2 :

(WebMvcConfigurerAdapter 클래스 재정의)

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    super.addResourceHandlers(registry);
    registry.addResourceHandler("*.efi").addResourceLocations("/");
}

나는 봄에 충실하기 때문에 보통 옵션 2를 택하지만 강한 이유는 아닙니다.

정적 리소스 처리와 관련된 몇 가지 참조 :

ADD 1

옵션 2는 리소스 매핑과 관련하여 훨씬 더 많은 유연성을 제공합니다. WEB-INF 폴더 내의 리소스까지 맵핑 할 수 있습니다.

해결법

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

    1.다음은 "기본"Servlet To Resource 자원에 적용 할 수없는 Falling Back의 구체적인 예입니다.

    다음은 "기본"Servlet To Resource 자원에 적용 할 수없는 Falling Back의 구체적인 예입니다.

    이것은 위의 접근 방식의 일반적인 구현입니다.

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
    {
        configurer.enable();
        return;
    }
    

    그러나, Spring 4에서 404 에러를 처리하기위한 최선의 방법은 setThrowExceptionIfNoHandlerFound를 사용하는 것입니다.

    @Override
    protected DispatcherServlet createDispatcherServlet(WebApplicationContext servletAppContext)
    {
        DispatcherServlet dispatcherServlet = (DispatcherServlet) super.createDispatcherServlet(servletAppContext);
        dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
        return dispatcherServlet;
    }
    

    불행히도 DispatcherServlet의 설명서에 따르면

    사실, 이것이 사실입니다. 위의 두 가지 방법을 모두 사용해도 NoHandlerFoundException이 발생하지 않으므로 내 404 맞춤 오류 페이지가 해결되지 않습니다. 이제 configureDefaultServletHandling 메서드를 주석 처리하면 NoHandlerFoundException이 발생하고 @ControllerAdvice를 통해 연결된 응답으로 표시된 오류 처리가 내 사용자 지정 'notFoundPage'로 처리됩니다.

    죄송합니다. 이제 정적 리소스 (예 : 'default.css')가 해결되지 않았습니다.

    DEBUG org.springframework.web.servlet.DispatcherServlet - Handler execution resulted in exception - forwarding to resolved error view: ModelAndView: reference to view with name 'notFoundPage'; model is {}
    org.springframework.web.servlet.NoHandlerFoundException: No handler found for GET /webapp-test/style/default.css
    

    나는이 두 가지 접근 방식을 서로 조화시켜 서로 간섭하지 않을 방법을 찾지 못합니다. 결론적으로이 경우 "기본 서블릿"접근 방식은 정적 리소스를 제공하는 데 적절하지 않으므로 addResourceHandlers 메소드가 필요합니다.

    addResourceHandlers 메소드를 사용할 때의 이점은 다음과 같습니다.

    또한 기본 서블릿으로 정적 리소스를 처리하면 원하지 않는 부작용이 발생할 수있는보다 복잡한 예를 보려면이 대답을 참조하십시오.

  2. from https://stackoverflow.com/questions/34279705/why-are-there-2-ways-to-handle-static-resources-in-spring-addresourcehandlers-a by cc-by-sa and MIT license