[SPRING] Spring에서 정적 리소스 (addResourceHandlers 및 컨테이너의 기본 서블릿)를 처리하는 두 가지 방법은 무엇입니까?
SPRINGSpring에서 정적 리소스 (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.다음은 "기본"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 메소드를 사용할 때의 이점은 다음과 같습니다.
또한 기본 서블릿으로 정적 리소스를 처리하면 원하지 않는 부작용이 발생할 수있는보다 복잡한 예를 보려면이 대답을 참조하십시오.
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
'SPRING' 카테고리의 다른 글
[SPRING] spring3-annotation-JdbcDaoSupport (0) | 2019.01.20 |
---|---|
[SPRING] Spring OAuth2.0 : 클라이언트 ID를 기반으로 사용자 역할 가져 오기 (0) | 2019.01.20 |
[SPRING] 봄 폼 바인딩하는 방법? [java.lang.String] 유형의 값을 필수 유형으로 변환 할 수 없습니다. (0) | 2019.01.20 |
[SPRING] java.lang.NoSuchMethodError : org.springframework.beans.MutablePropertyValues.add (0) | 2019.01.20 |
[SPRING] Spring Data Rest 2.1에서 하위 페이지 매김 (Paginate) (0) | 2019.01.20 |