如何在Spring @RequestMapping中用正则匹配指定路径并排除特定URL
Spring @RequestMapping 正则匹配解决方案
需求回顾
需要匹配的路径:
//settings/settings/users/settings/users/roles/settings/users/roles/admin
需要排除的路径:
- 带后缀的文件路径(如
/style.css、/manifest.json) - 所有
/api开头的路径(如/api、/api/users)
问题分析
你之前尝试的正则存在局限性:
/{path:[^\.]*}:仅能匹配单层级非后缀路径,无法覆盖多级路径(如/settings/users)/{path:[^\.]*}/*:强制要求至少两层路径,导致单层级路径(如/settings)匹配失效
正确正则表达式与代码实现
可以通过正则前瞻断言排除 /api 开头的路径,同时用可选多级路径段覆盖单层级和多级场景,确保所有路径不含后缀。
简洁版实现
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class FrontendController { private static final Logger logger = LoggerFactory.getLogger(FrontendController.class); @RequestMapping(value = "/{path:^(?!api)(?:$|[^\\.]+(?:/[^\\.]+)*)$}") public String redirect() { logger.info("Redirect call to the frontend"); return "forward:/"; } }
正则逻辑说明
^(?!api):正则前瞻断言,直接排除所有以api开头的路径(?:$|[^\\.]+(?:/[^\\.]+)*):$:匹配根路径/[^\\.]+:匹配单个不含.的路径段(如settings)(?:/[^\\.]+)*:允许后续追加任意多个不含.的子路径段(如/users、/roles)
拆分版实现(可读性更强)
如果觉得单正则过于复杂,也可以拆分配置:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class FrontendController { private static final Logger logger = LoggerFactory.getLogger(FrontendController.class); @RequestMapping(value = { "/", "/{path:^(?!api)[^\\.]+}(/{subpath:[^\\.]+})*" }) public String redirect() { logger.info("Redirect call to the frontend"); return "forward:/"; } }
验证效果
- 符合匹配条件的路径全部能被命中
- 带后缀的文件路径、
/api开头的路径会被自动排除
内容的提问来源于stack exchange,提问作者Socrates
相关产品推荐
相关产品推荐

