You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:48:51