我是春天的新手。我注意到,在处理静态资源时,有两个可用的选项:
选项1:
如果使用以下代码将 Spring的DispatcherServlet
映射到/
,这使其成为“默认Servlet",则可以使用RequestMapping
注释(覆盖AbstractAnnotationConfigDispatcherServletInitializer
类)将某些静态资源映射到Spring处理程序:
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
然后,我们仍然可以启用容器的“默认Servlet”来处理那些其URL模式未被Spring映射覆盖(覆盖WebMvcConfigurerAdapter
类)的静态资源:
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
这基本上使用servlet容器的“默认Servlet”作为catch- all 来处理的DispatcherServlet
遗漏的所有静态资源。
备选方案2:
(重写WebMvcConfigurerAdapter
类)
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
registry.addResourceHandler("*.efi").addResourceLocations("/");
}
我通常选择第2种选择,因为我想坚持使用Spring,但我知道这不是一个很好的理由。
与静态资源处理有关的一些参考资料:
添加1
选项2似乎为资源映射提供了更大的灵活性。甚至可以映射WEB-INF
文件夹中的资源。
发布于 2016-11-12 14:27:59
以下是回到“默认”Servlet以服务于资源不适用的具体示例。
这是上述方法的典型实现:
@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的文档
注意,如果使用
DefaultServletHttpRequestHandler
,那么请求将始终转发到默认servlet,在这种情况下永远不会抛出NoHandlerFoundException
。
事实上,情况就是这样。将上述两种方法结合在一起并不会触发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
我看不出有任何办法调和这两种办法,使它们不会相互干扰。我的结论是,在这种情况下,“默认Servlet”方法不适合为静态资源提供服务,这就留给了addResourceHandlers
方法。
使用方法的好处包括:
另外,请参阅这个答案中一个更复杂的示例,说明使用默认servlet处理静态资源会导致不必要的副作用。
https://stackoverflow.com/questions/34279705
复制相似问题