如何让@RequestMapping正则排除API路径?Spring Boot单页应用路由配置
解决Spring Boot单页应用重定向排除API端点的问题
我来帮你搞定这个需求!你当前的重定向规则会捕获所有不带后缀的路径,但想让/api开头的请求跳过这个规则直接走API逻辑,有几种实用的实现方式:
方法一:修改@RequestMapping的正则表达式(简洁版)
直接在原有的路径正则里加入负向前瞻断言,排除以api开头的路径:
@RequestMapping(value = "/**/{[path:(?!api).[^\\.]*}") public String redirect() { return "forward:/"; }
这里的(?!api)是正则的负向前瞻语法,意思是路径片段不能以api开头。这样所有/api开头的请求就不会被这个方法匹配,会正常路由到你的API控制器。
方法二:通过WebMvcConfigurer配置(灵活版)
如果需要更灵活的控制,可以实现WebMvcConfigurer来配置视图控制器或资源处理器,明确排除API路径:
方式A:用ViewControllerRegistry排除指定路径
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { // 匹配所有非API、非静态资源的路径,转发到index.html registry.addViewController("/**") .setViewName("forward:/") .setExcludePatterns("/api/**", "/static/**"); } }
方式B:用资源处理器处理静态资源和SPA路由
这种方式更适合单页应用的静态资源管理,同时处理路由 fallback:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/") .resourceChain(true) .addResolver(new PathResourceResolver() { @Override protected Resource getResource(String resourcePath, Resource location) throws IOException { Resource requestedResource = location.createRelative(resourcePath); // 如果请求的资源不存在(不是静态文件),且不是API路径,就返回index.html if (requestedResource.exists() && requestedResource.isReadable()) { return requestedResource; } else if (!resourcePath.startsWith("api/")) { return new ClassPathResource("/static/index.html"); } return null; } }); } }
方法三:在重定向方法内判断路径(直观版)
如果不想改正则或配置类,也可以直接在原方法里判断请求路径,跳过API请求:
@RequestMapping(value = "/**/{[path:[^\\.]*}") public String redirect(HttpServletRequest request) { String requestUri = request.getRequestURI(); // 如果是/api开头的请求,返回null让Spring找对应的API控制器处理 if (requestUri.startsWith("/api/")) { return null; } return "forward:/"; }
总结
- 推荐方法一,代码改动最小,适合简单场景;
- 如果需要同时管理静态资源和路由,方法二的方式B更适合生产环境;
- 方法三最直观,适合快速调试或小项目。
内容的提问来源于stack exchange,提问作者Erdem Aydemir
相关产品推荐
相关产品推荐

