🤖🤖-摘要:
本文介绍SpringBoot Web开发中的路径匹配技术。介绍了Spring5.3后的请求路径匹配策略,包括旧的AntPathMatcher策略和新的默认PathPatternParser策略。文章解释了如何在代码中选择和配置这两种策略

路径匹配

Spring5.3之后加入了更多的请求路径匹配的实现策略,

以前只支持AntPathMatcher策略,现在提供了PathPatternParser策略,
并且可以指定使用哪种策略

默认使用PathPatternParser策略

AntPathMatcher策略

Ant 风格的路径模式语法具有以下规则:

  • :表示任意数量的*字符,0~n
  • ?:表示任意一个字符,
  • *:表示任意数量的*目录
  • {}:表示一个命名的模式占位符
  • []:表示字符集合,例如[a-z]表示小写字母

例如:

  • *.html 匹配任意名称,且扩展名为.html的文件
  • /folder1//.java 匹配在folder1目录下的任意两级目录下的.java文件
  • /folder2/**/*.jsp 匹配在folder2目录下任意目录深度的.jsp文件
  • /{type}/{id}.html 匹配任意文件名为{id}.html,在任意命名的{type}目录下的文件
注意:Ant 风格的路径模式语法中的特殊字符需要转义,如:
1. 要匹配文件路径中的星号,则需要转义为\\*
2. 要匹配文件路径中的问号,则需要转义为\\?

代码测试:

@Slf4j
@RestController
public class AntPathController {
@GetMapping("/a*/b?/{p1:[a-f]+}")
public String hello(HttpServletRequest request,
@PathVariable("p1") String path) {

log.info("路径变量p1: {}", path);
//获取请求路径
return request.getRequestURI();
}
}

访问:http://localhost:8080/ads/bd/adf

AntPathMatcher策略

控制台打印:

路径变量p1: adf

PathPatternParser策略

  • 基准测试下,有6~8倍吞吐量提升,降低30%~40%空间分配率
  • 兼容AntPathMatcher语法,并支持更多类型的路径模式
注意:"**" 多段匹配的支持仅允许在模式末尾使用

修改默认策略

  • 配置文件:spring.mvc.pathmatch.matching-strategy=ant_path_matcher
  • 代码修改:
/**
* 此方法可以修改路径匹配规则
* 从spring5.3 开始,默认 PathPatternParser
* 想要修改为 AntPathMatcher,则只需设置为空即可
*/
@Override
public void configurePathMatch(PathMatchConfigurer configurer){
configurer.setPatternParser(null);
}

小结一下

  • 使用默认的路径匹配规则(PathPatternParser)即可,性能高,兼容Ant风格
  • 如果中间需要双星(**),只能换回Ant风格

SpringBoot 底层匹配策略:
WebMvcAutoConfiguration.java

@Override
public void configurePathMatch(PathMatchConfigurer configurer){
// 只有 ANT_PATH_MATCHER 才条件成立,创建 new AntPathMatcher()
if(this.mvcProperties.getPathmatch().getMatchingStrategy()==WebMvcProperties.MatchingStrategy.ANT_PATH_MATCHER){
configurer.setPathMatcher(new AntPathMatcher());
this.dispatcherServletPath.ifAvailable((dispatcherPath)->{
String servletUrlMapping=dispatcherPath.getServletUrlMapping();
if(servletUrlMapping.equals("/")&&singleDispatcherServlet()){
UrlPathHelper urlPathHelper=new UrlPathHelper();
urlPathHelper.setAlwaysUseFullPath(true);
configurer.setUrlPathHelper(urlPathHelper);
}
});
}
}

默认情况,WebMvcProperties.java:

// 默认情况是:PATH_PATTERN_PARSER
private MatchingStrategy matchingStrategy=MatchingStrategy.PATH_PATTERN_PARSER;

/////////////////////////////
// MatchingStrategy 是枚举类
public enum MatchingStrategy {

/**
* Use the {@code AntPathMatcher} implementation.
*/
ANT_PATH_MATCHER,

/**
* Use the {@code PathPatternParser} implementation.
*/
PATH_PATTERN_PARSER

}