如何用正则表达式实现Spring RequestMapping多级无后缀路径映射
问题
需要映射**不含英文句点(.)**的请求路径,并为这类路径自动添加.html后缀。具体要求:
- 匹配路径示例:
/a、/a/b、/a/b/c - 不匹配路径示例:
/a.html、/a/b.html、/a/b/c.html
目前的实现方式是为每个路径层级单独编写@RequestMapping,但这种方式需要重复编写映射规则,代码冗余且不够灵活。尝试过使用/**通配符,但不知道如何过滤掉包含英文句点的路径。现有代码示例如下:
@Controller public class HtmlController { @RequestMapping("/{page:^[^.]*$}") public String oneLevel(@PathVariable("page") String page) { return '/' + page + ".html"; } @RequestMapping("/{first}/{page:^[^.]*$}") public String twoLevels(@PathVariable("first") String first, @PathVariable("page") String page) { return '/' + first + '/' + page + ".html"; } // 更多层级的重复映射... }
优化解决方案
可以通过带正则表达式的通配路径实现一次性匹配所有不含句点的多层级路径,无需为每个层级单独编写方法。核心思路是让路径的最后一段满足[^.]+(不含句点的非空字符串),结合通配符覆盖所有层级:
@Controller public class HtmlController { @RequestMapping("/**/{path:^[^.]*$}") public String handleAllLevels(HttpServletRequest request) { // 获取完整请求路径(自动去除项目上下文路径) String requestUri = request.getRequestURI(); // 直接拼接.html后缀返回 return requestUri + ".html"; } }
规则说明
/**/{path:^[^.]*$}:该规则会匹配所有最后一段路径不含句点的多层级请求,自动过滤掉带.html这类后缀的路径。- 通过
HttpServletRequest获取完整路径,避免手动拼接多个@PathVariable,代码简洁且适配任意层级的路径。 - 如果需要严格校验每一段路径都不含句点,可使用更精确的正则映射:
@RequestMapping("/{segments:.*[^.]}"),实际场景中仅校验最后一段通常就能满足需求。
内容的提问来源于stack exchange,提问作者Ahmed Ashour
相关产品推荐
相关产品推荐

