Spring MVC Java WebMvcConfigurerAdapter.addResourceHandlers

Spring MVC Java WebMvcConfigurerAdapter.addResourceHandlers

我正在查看具有以下 Java 配置文件的项目:

@Configuration
@EnableWebMvc
@ComponentScan("spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter {

  @Bean
  public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
  }

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

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    super.addResourceHandlers(registry);
  }

}

该项目在 webapps/resources 目录中有一些正在提供的静态资源。我的问题是我不确定为什么。看来这行得通,上面对 addResourceHandlers(...) 的调用应该是

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

我试图在 Spring 文档中查找可能指示默认值但找不到的内容,所以我不确定该项目为何有效。

由于 DefaultServletHandlerConfigurer:

,该项目可以提供静态资源

Configures a request handler for serving static resources by forwarding the request to the Servlet container's "default" Servlet.

我在以下示例中使用 Jetty,但其他 servlet 容器(例如 Tomcat)的行为应该类似。下载 Jetty 9 发行版,然后在 webapps 中创建这些文件:

example/
    hello.txt

启动 Jetty 服务器。我们有 deployed the simplest application 可以想象的。您应该能够访问该文件:

http://localhost:8080/example/hello.txt

servlet 容器无需任何额外配置即可提供静态资源。一旦 Spring MVC 发挥作用,这种行为就会被抑制。 Spring MVC 将创建一个 front controller, DispatcherServlet, and park it at "/". Every incoming request will go through this single servlet, and the servlet will find the appropriate component in the app to actually process the request (e.g. a @RequestMapping method in a @Controller class)。如果找不到请求的处理程序,我们有 404s。

处理程序 DefaultServletHandlerConfigurer 的优先级最低。如果启用,它允许前端控制器首先处理请求。当失败时,它将请求转发到 servlet 容器,请求被视为静态资源读取。

这是一种提供静态文件的快速而肮脏的方式。实际上,您不希望通过 GET 获得任何不走寻常路的东西。您只想允许特定的文件和文件夹,您可以使用 WebMvcConfigurerAdapter.addResourceHandlers().