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

如何配置Java Spring GET请求匹配除/api和/swagger-ui外的所有路由

解决Spring匹配除/api外所有路由的问题

你的问题根源在于当前控制器的@GetMapping("/**/{path:[^\\.]*}")会匹配所有GET请求,包括/api/开头的接口,导致这些GET请求被转发到React页面;而POST请求不受影响是因为该控制器只处理GET方法。

下面是几种可行的解决方案:

方案一:修改控制器映射路径,排除/api开头请求

利用Spring支持的否定路径模式,直接在映射规则中排除/api路径:

@Controller
public class ClientForwardController {

    // 匹配所有非/api开头、且路径不含后缀的GET请求
    @GetMapping(value = {"/**/{path:[^\\.]*}", "!/api/**"})
    public String forward() { 
        return "forward:/";
    }
}

方案二:通过WebMvcConfigurer配置全局转发规则(推荐)

这种方式更清晰,统一管理前端路由转发逻辑,同时自动排除/api接口:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // 配置转发规则:非/api开头、非静态资源的路径都转发到index.html
        registry.addViewController("/**")
                .setViewName("forward:/index.html")
                .setCustomCondition(new RequestCondition() {
                    @Override
                    public RequestCondition combine(RequestCondition other) {
                        return this;
                    }

                    @Override
                    public RequestCondition getMatchingCondition(HttpServletRequest request) {
                        String requestUri = request.getRequestURI();
                        // 排除/api开头的接口和带后缀的静态资源(如.js、.css、.png等)
                        if (requestUri.startsWith("/api/") || requestUri.contains(".")) {
                            return null;
                        }
                        return this;
                    }

                    @Override
                    public int compareTo(RequestCondition other, HttpServletRequest request) {
                        return 0;
                    }
                });
    }
}

方案三:控制器内手动判断请求路径

如果不想修改映射规则,也可以在方法内判断请求URI,跳过/api开头的请求:

@Controller
public class ClientForwardController {

    @GetMapping(value = "/**/{path:[^\\.]*}")
    public String forward(HttpServletRequest request) { 
        String requestUri = request.getRequestURI();
        // 若为/api开头请求,返回null让Spring寻找对应API控制器处理
        if (requestUri.startsWith("/api/")) {
            return null;
        }
        return "forward:/";
    }
}

注意事项

  • 确保你的API控制器已经正确配置了@RequestMapping("/api")或对应子路径,Spring会优先匹配API控制器的请求,再执行前端路由转发。
  • React打包后的静态资源(如.js、.css)需确保Spring能正确访问,可通过配置spring.web.resources.static-locations指定静态资源目录。

内容的提问来源于stack exchange,提问作者Ho Quang Lam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:51:17