ResourceHandlerは静的コンテンツを処理しますか?



この文章の目的は?


Springでは、HTMLなどの静的なコンテンツをどのように処理しますか?

ResourceHandler?


このHandlerは、画像、JavaScript、CSS、HTMLなどの静的リソースを処理します.Tomcat、Nettyなどのサーブレットコンテナは、基本的に静的リソースを処理するためのDepartサーブレットを提供する.
Springは、デバッガがすべてのリクエストをブロックすると、直接作成したHandlerではなく、まず静的リソースが見つかるという問題で、デバッガに静的リソースを委任して処理します.したがって,ResourceHandlerの登録優先度は最も低い.
Spring Bootは、ResourceHandlerを「resource/static」フォルダまたは「resource/public」フォルダとして提供し、設定する必要はありません.スプリングではなくカスタムリソースHandlerを使用する場合は、WebConfiguratorインタフェースに追加できます.また、ResourceHandlerを登録する際には、効率を向上させるために複数のキャッシュポリシーを設定できます.
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/mobile/**")
                .addResourceLocations("classpath:/mobile/")
                .setCacheControl(CacheControl.maxAge(10, TimeUnit.MINUTES));
//                // 캐시를 사용할지 말지를 결정. 운영중이라면 true, 개발중이라면 false가 적절
//                .resourceChain(true) 
//                // 요청에 해당하는 리소스를 찾는 방법
//                .addResolver() 
//                // 응답으로 내보낼 리소스를 변경하는 방법
//                .addTransformer() 
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class SimpleControllerTest {

    @Autowired
    MockMvc mockMvc;


    @Test
    public void helloStatic() throws Exception {
        // 기본 ResourceHandler
//        this.mockMvc.perform(get("/index.html"))
//                .andDo(print())
//                .andExpect(status().isOk())
//                .andExpect(content().string(Matchers.containsString("index")));

        // 직접 만든 ResourceHandler
        this.mockMvc.perform(get("/mobile/index.html"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(content().string(Matchers.containsString("mobile")))
                .andExpect(header().exists(HttpHeaders.CACHE_CONTROL));

    }
}

本文の参考

  • 白奇仙のSpringWeb MVC