带通配符的Servlet映射问题:web.xml中特定路径可行通配符失效
解决Spring MVC Servlet通配符映射失效问题
我之前也踩过这个坑!当指定具体文件路径时Servlet映射能正常生效,但用通配符就不行,基本都是Spring MVC的静态资源处理规则或者Servlet容器的匹配优先级在搞事情,咱们一步步来排查解决:
1. 先确认你的通配符写法是否正确
Servlet规范里的URL匹配规则有明确优先级:精确匹配 > 路径匹配(带/*) > 扩展名匹配(*.xx)。如果你的通配符写法不对,自然不会生效:
- 如果你想匹配
/resources123/下的所有子资源,正确的<url-pattern>应该是/resources123/*(注意末尾的/*,少了它只会匹配精确的/resources123路径); - 如果你想匹配所有
.css文件,可以写*.css,但这种写法会拦截所有路径下的css请求,不推荐针对特定资源目录使用。
2. 配置Spring MVC静态资源映射(核心解决步骤)
当DispatcherServlet通过通配符接管了某个路径的请求后,它默认会尝试去找对应的Controller方法处理,而不会自动转发到静态文件。这时候必须告诉Spring哪些请求是静态资源,直接返回文件内容:
XML配置方式(比如spring-servlet.xml)
<!-- 开启Spring MVC注解驱动,必须加,否则静态资源配置不生效 --> <mvc:annotation-driven/> <!-- 配置静态资源映射:匹配/resources123/**路径的请求,从/resources123/目录下找资源 --> <mvc:resources mapping="/resources123/**" location="/resources123/"/>
JavaConfig配置方式
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc // 开启Spring MVC注解驱动 public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 配置静态资源映射规则 registry.addResourceHandler("/resources123/**") .addResourceLocations("/resources123/"); } }
3. 检查是否有其他Servlet的映射冲突
如果你的Web应用里还有其他Servlet(比如容器默认的DefaultServlet,或者自定义的其他Servlet)也配置了类似的通配符映射(比如/resources123/*),Servlet容器会根据Servlet的加载顺序来决定谁处理请求,可能导致你的DispatcherServlet拿不到请求。这种情况下,要么调整其他Servlet的映射路径,要么调整DispatcherServlet的<load-on-startup>值(值越小加载优先级越高)。
4. 验证静态资源路径是否正确
最后再确认一下你的静态资源是不是真的放在Web应用的/resources123/目录下,比如在Tomcat里,这个目录应该在webapp/resources123/下。另外注意Linux服务器上路径是区分大小写的,别因为大小写不匹配导致找不到资源。
内容的提问来源于stack exchange,提问作者DD.
相关产品推荐
相关产品推荐

