Ant path匹配规则

本文介绍了Spring MVC中Antpath的路径匹配原则及其灵活性,包括通配符的使用方式及示例,同时还探讨了HandlerMapping的两种实现方式,BeanNameUrlHandlerMapping与SimpleUrlHandlerMapping的特点及适用场景。


Ant path 匹配原则

路径匹配原则(Path Matching) Spring MVC中的路径匹配要比标准的web.xml要灵活的多。默认的策略实现了 org.springframework.util.AntPathMatcher,就像名字提示的那样,路径模式是使用了Apache Ant的样式路径,Apache Ant样式的路径有三种通配符匹配方法(在下面的表格中列出)
这些可以组合出很多种灵活的路径模式
Table Ant Wildcard Characters
WildcardDescription 
?匹配任何单字符 
*匹配0或者任意数量的字符 
**匹配0或者更多的目录 

Table Example Ant-Style Path Patterns

PathDescription 
/app/*.x匹配(Matches)所有在app路径下的.x文件 
/app/p?ttern匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern 
/**/example匹配(Matches) /app/example, /app/foo/example, 和 /example 
/app/**/dir/file.匹配(Matches) /app/dir/file.jsp, /app/foo/dir/file.html,/app/foo/bar/dir/file.pdf, 和 /app/dir/file.java 
/**/*.jsp匹配(Matches)任何的.jsp 文件 

 

 

HandlerMapping

 

一 个WEB应用程序基本上都要依赖于URL与请求处理器之间的映射,Spring MVC也是一样,但Spring MVC就像Spring所作的一切一样(译者:灵活,可以配置各种东西,但是也造成了很多复杂性),肯定不会只有一种方法来映射URL和 Controller之间的关系,并且在实际上,允许你自己创建映射规则和实现,而不仅仅依赖URL映射。
Spring提供了URL的映射处理, 并且处理路径模式的顺序和方法并没有限定到任何的接口上。Spring MVC的默认实现org.springframework.web.servlet.handler. AbstractUrlHandlerMapping, 会以最长符合路径模式来匹配一个路径。
例如:给定一个请求是 /app/dir/file.jsp 并且现在存在两个路径匹配模式/**/*.jsp 和/app/dir/*.jsp, 那么,URL会匹配那个模式呢?最后的那个模式/app/dir/*.jsp,会因为最长(has more characters)的原则被匹配,它比/**/*.jsp拥有更多的字符.注意的是,这个原则并没有在任何高级别的接口中指定,但却是一种实现细节。
!!下面看一下默认的两个HandlerMapping
BeanNameUrlHandlerMapping
默 认的映射策略实现是org.springframework.web. servlet.handler.BeanNameUrlHandlerMapping类. 这个类要求任何有可能处理请求的Bean都要起一个以反斜杠(/)字符开头的名称或者别名,这个名称或者别名可以是符合URL Path匹配原则中的任何名字。

Listing A Controller Mapped by a Bean Name

   
xml 代码
 
  1. <bean name="/home"  
  2. class="com.apress.expertspringmvc.flight.web.HomeController">  
  3. <property name="flightService" ref="flightService" />  
  4. </bean>  


■注意:你不能使用id这个属性来指定任何的URL路径,因为在XML规格定中禁止(/)字符来指定XML的id,不过你可以在一个Bean定义中同时拥有id和name属性 
BeanNameUrlHandlerMapping 的缺点
它 非常便于使用的同时,也拥有一些缺点。它不能影射一个Prototype的Bean.换句话说,当使用 BeanNameUrlHandlerMapping时, 所有的请求处理类只能是单例的(singletons) . 一般来说,Controllers 都是按照单例建立的,所以这个并不是一个很严重的问题.还有,我会在后面的章节中介绍Controller,只会有很少类型的Controller需要是 prototypes.


■注释: Prototype bean 是一种非单例(non-singleton)的bean. 任何一次调用ApplicationContext的getBean()方法时都会返回一个新的Bean实例更多的信息请参照<<Pro Spring>>.


BeanNameUrlHandlerMapping的另外一个问题存在于在你的应用程序中 应用拦截(interceptor). 因为请求的映射(handler mapping )和Bean(beans imapping)的映射给绑定在一起了,没有分开,这样就不可能在Controller和拦截之间创建复杂的关系。如果有复杂的请求映射需求,你可以用 SimpleUrlHandlerMapping 来代替BeanNameUrlHandlerMapping. SimpleUrlHandlerMapping作为BeanNameUrlHandlerMapping的另外一种选择, SimpleUrlHandlerMapping直指BeanNameUrlHandlerMapping的两大软肋.它可以映射 prototype类型的请求处理器,并且它允许你为处理器(handlers)和拦截器(interceptors)之间创建复杂灵活的映射 
路 径的映射算法与BeanNameUrlHandlerMapping是 使用相同的基础组件,所以这个模式依然是映射URL到请求处理器的(request handler) ,你简单的在ApplicationContext中声明一下,就可以使用SimpleUrlHandlerMapping了. DispatcherServlet会根据类型找到的,并且不会创建默认的映射器了(BeanNameUrlHandlerMapping).意思就是, 如果你想两个都用,那么就要全部声明一下在ApplicationContext里.
■提示 DispatcherServlet会链式处理请求的(译者:依次处理请求,可以参照过滤器和GOF中的责任链模式),这样允许按照你的要求处理映射,映射处理器(Handler mappings )实现了Orderedr接口.

原文地址:http://www.blogjava.net/supercrsky/articles/293728.html

<think>好的,我现在需要解决用户在Spring Boot项目中配置了AntPathMatcher后,静态图片资源仍然返回404的问题。首先,我应该回顾之前用户的问题和我的回答,看看有没有相关的信息可以借鉴。用户之前提到过静态资源404的可能原因,包括基础路径配置、特殊字符处理、构建缓存问题、自定义配置验证和拦截器冲突。现在用户的问题是配置了AntPathMatcher后仍然出现404,所以需要重点检查与路径匹配策略相关的配置。首先,AntPathMatcher是SpringMVC中用于路径匹配的策略,切换为AntPathMatcher通常是为了支持更灵活的URL模式,比如在SpringBoot2.6及以上版本默认使用PathPatternParser,而AntPathMatcher可能在处理某些特殊路径时行为不同。用户可能在配置了mvc.pathmatch.matching-strategy=ant_path_matcher后,静态资源仍然无法访问,需要检查是否正确配置,并且没有其他因素干扰。 接下来,可能的几个原因: 1. **配置未生效**:检查application.yml或application.properties中的配置是否正确,是否拼写错误,或者配置的位置不正确导致未被加载。2.**静态资源位置与路径匹配策略冲突**:AntPathMatcher可能对路径的解析方式不同,导致原本默认的静态资源路径被覆盖或无法正确匹配。比如,如果自定义了资源处理器但没有正确处理默认路径,或者路径模式写法不符合Ant的语法。 3. **拦截器或过滤器拦截请求**:即使配置了AntPathMatcher,如果拦截器没有排除静态资源路径,仍然可能被拦截,导致404。需要检查是否有拦截器配置,是否排除了相应的路径。 4. **缓存问题**:项目重新构建后,资源未被正确复制到target目录,或者浏览器缓存导致旧路径无法访问。可能需要清理target并重新构建,或者使用无痕模式测试。5.**路径大小写敏感**:AntPathMatcher在某些情况下可能对路径的大小写更敏感,尤其是在不同的操作系统上,比如Linux环境下,需要确保请求的URL与文件路径的大小写完全匹配。 然后,解决方案可能包括:-确认配置正确:在配置文件中检查spring.mvc.pathmatch.matching-strategy是否设置为ant_path_matcher,并且没有其他配置覆盖。-检查静态资源的位置是否符合SpringBoot的默认目录结构,如static、public等,并且文件确实存在于这些目录中。 -查看是否存在自定义的WebMvcConfigurer,是否覆盖了默认的资源处理,导致AntPathMatcher的配置没有生效。-使用日志调试,查看Spring Boot启动时加载的资源处理器,确认静态资源的路径是否被正确注册。-检查拦截器配置,确保静态资源路径被排除,不被拦截。 此外,用户之前的回答中提到特殊字符的处理需要配置Tomcat的relaxed-path-chars,这可能也是一个因素,如果图片文件名包含特殊字符,即使配置了AntPathMatcher,也需要Tomcat的支持才能正确解析。可能的测试步骤: 1.在application.yml中确认配置:```yamlspring:mvc:pathmatch:matching-strategy: ant_path_matcher```2.检查静态资源是否放在src/main/resources/static/目录下,例如图片路径为static/images/test.jpg,访问路径应为http://localhost:8080/images/test.jpg。 3.如果有自定义资源处理,确保添加了默认路径:```java@Overridepublicvoid addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");}``` 4.查看日志,确认资源处理器是否加载,可以通过开启SpringBoot的debug日志查看。5.清理项目并重新构建,确保资源被复制到target目录。 6.使用Postman或curl测试,避免浏览器缓存问题。可能还需要考虑SpringBoot版本的问题,不同版本对路径匹配策略的处理可能有差异,比如2.6之后的版本默认使用PathPatternParser,而切换到AntPathMatcher可能需要更多的配置调整。 如果用户同时配置了多个资源处理器,或者存在其他Web配置(如Security配置),也可能导致冲突,需要逐一排查。总结下来,用户的问题可能出在配置未正确应用、路径匹配规则与资源位置不符、拦截器拦截或缓存问题上。需要系统性地检查这些方面,逐步排除可能的原因。</think>### Spring Boot配置AntPathMatcher后静态资源404问题解析 --- #### 一、**核心原因排查** 1. **配置未生效** - 检查`application.yml`是否**正确配置**且位置正确: ```yaml spring: mvc: pathmatch: matching-strategy: ant_path_matcher # 必须为ant_path_matcher[^3] ``` - 验证配置是否被其他配置覆盖(如`@EnableWebMvc`可能禁用默认配置) 2. **路径匹配规则冲突** - AntPathMatcher要求**路径模式严格匹配**,例如: - 正确路径:`/images/logo.png` - 错误路径:`/images//logo.png`(多斜杠)或`/images%20/logo.png`(URL编码问题) 3. **静态资源位置错误** - 确保资源存放在以下目录之一: ```bash src/main/resources/static/ src/main/resources/public/ ``` - 验证`target/classes/static/`中是否存在编译后的资源文件[^1] --- #### 二、**解决方案** 1. **完整配置示例** ```yaml spring: mvc: pathmatch: matching-strategy: ant_path_matcher web: resources: static-locations: classpath:/static/ # 显式指定静态资源位置[^2] ``` 2. **路径通配符调整** - 若使用自定义资源映射,需适配Ant风格: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/img/**") .addResourceLocations("classpath:/static/images/"); // Ant路径需精确到子目录 } } ``` 3. **拦截器排除检查** ```java @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()) .excludePathPatterns("/static/**", "/img/**"); // 必须排除静态资源路径[^2] } ``` --- #### 三、**调试技巧** 1. **查看已注册资源处理器** - 启动时添加`--debug`参数,在日志中搜索`ResourceHandler`: ```bash 2023-10-01 12:00:00 DEBUG o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/img/**] onto handler of type [ResourceHttpRequestHandler] ``` 2. **文件系统验证** - 直接访问编译后的资源文件(需IDE显示隐藏目录): ```bash # 示例路径 target/classes/static/images/logo.png ``` --- #### 四、**特殊场景处理** 1. **带版本号资源访问** ```html <!-- 前端页面添加版本号避免缓存 --> <img src="/images/logo.png?v=2.0"> ``` 2. **Windows/Linux路径差异** - 在Linux服务器部署时,需确保文件名**严格匹配大小写** - 检查文件权限: ```bash chmod -R 755 /project_dir/src/main/resources/static/ ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值