如何从ViewControllerRegistry排除无/api前缀的OAuth2重定向URI
问题根因
你现有配置的路径转发规则,仅对根路径下第一级为api的路径做了转发排除,而OAuth2回调路径/oauth/redirect的第一级路径为oauth,未被纳入排除范围,因此会命中二级路径转发规则,被错误转发到前端index.html。
修改方案
无需新增额外配置类,直接调整现有路径匹配规则的正则负向断言,将oauth加入一级路径排除列表即可。注意Spring MVC的视图控制器按注册顺序匹配,优先级从上到下递减,无需调整现有规则的注册顺序。
修改后的完整配置代码:
@Configuration public class WebRouteConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { // 根路径转发到前端入口 registry.addViewController("/") .setViewName("forward:/index.html"); // 单级路径转发,不会匹配多级路径(如/api/**、/oauth/redirect) registry.addViewController("/{x:[\\w\\-]+}") .setViewName("forward:/index.html"); // 二级路径:排除第一级为api、oauth的路径,这类路径直接交由后端控制器处理 registry.addViewController("/{x:^(?!api$|oauth$).*$}/{y:[\\w\\-]+}") .setViewName("forward:/index.html"); // 自定义/ABC/前缀的多级路径:同步排除api、oauth前缀的一级路径 registry.addViewController("/{x:^(?!api$|oauth$).*$}/ABC/{y:[\\w\\-]+}") .setViewName("forward:/index.html"); } }
扩展说明
如果后续还有其他需要后端直接处理的根路径前缀(比如/login、/error、/actuator等),直接在正则的负向断言中通过|分隔追加即可,示例:/{x:^(?!api$|oauth$|login$|error$|actuator$).*$}/{y:[\\w\\-]+}
修改后路由逻辑如下:
- 所有
/api/**请求:正常走后端接口逻辑,不触发前端转发 - 所有
/oauth/**二级请求(包含/oauth/redirect):不命中转发规则,直接进入Spring Security的OAuth2认证流程 - 其余符合规则的前端路由路径:正常转发到
index.html,由React路由接管渲染,不会出现刷新404问题
内容的提问来源于stack exchange,提问作者Ramakrishna
相关产品推荐
相关产品推荐

