配置Spring处理静态资源的若干方法
在Java web容器(应用服务器)中,所有请求都交由servlet处理,包括js,css,html,图片等等,所以在使用Spring的DispatcherServlet接收所有请求(web.xml中url-pattern配置为/)时,静态资源将被拦截,因为在没有配置其他handlerMappings的情况下默认使用DefualtAnnotationHandlerMapping拦截使用注解的控制器,在所有请求映射中查找请求的URI,找不到则报错,如:No mapping found for HTTP request with URI [/ams/js/ext-all.js]
处理方案
方案一:在Spring 核心转发控制器DispatcherServler之前拦截静态资源(性能较好,但是不推荐使用)
不同的web容器(应用服务器)中处理静态资源的servlet名字有所不同,大致如下:
- Tomcat, Jetty, JBoss, and GlassFish:默认 Servlet 名字为 "default"
- Google App Engine:默认 Servlet 名字为 "_ah_default"
- Resin:默认 Servlet 名字为 "resin-file"
- WebLogic:默认 Servlet 名字为 "FileServlet"
- WebSphere:默认 Servlet 名字为 "SimpleFileServlet"
在web.xml中配置默认servlet ,位置需要在DispatcherServlet之前
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.extension</url-pattern> </servlet-mapping>
spring 通过 handlerMapping的order查找相应的请求映射
方案二、配置 <mvc:resources location="/resources/" mapping="/resources/**" /> 可配置执行的order,默认为最低优先级-1
方案三、配置 <mvc:default-servlet-handler/> order最大,最后匹配
举个例子:
浏览器请求一个叫test.jpg的图片资源时,Spring 会先执行 order 值比较小的,即先通过 DefaultAnnotationHandlerMapping 来找处理器,找不到,因为没有叫 test.jpg 的 Controller。再按 order 值升序找,由于最后一个 SimpleUrlHandlerMapping 是匹配 "/**" 的,所以会匹配上,再响应图片。
注意:配置方案2、3时需要添加基于注解的映射 <mvc:annotation-driven />,否则基于注解的控制器无法访问。(DefaultAnnotationHandlerMapping oder 为0,最先匹配)

浙公网安备 33010602011771号