You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Spring Cloud Gateway重定向404及Security配置Bean缺失问题

问题解决方法

核心问题

你碰到的两个问题根源都是Spring Cloud Gateway的反应式特性和原MVC风格配置不兼容

  • 替换spring-cloud-starter-gateway后启动报错:Gateway是基于WebFlux的反应式网关,而你的SecurityConfig用的是Spring MVC的HttpSecurity,WebFlux环境下不会生成这个Bean,导致注入失败。
  • 之前的404和现在的NoResourceFoundException:要么路由没生效,要么请求被MVC的DispatcherServlet接管,没走到Gateway的路由逻辑。

修复步骤

1. 重写Security配置为反应式版本

把原来的MVC风格Security配置换成WebFlux专用的,用ServerHttpSecurity替代HttpSecurity

package com.omb.ombgateway.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain gatewaySecurity(ServerHttpSecurity http) {
        http
                .csrf(csrf -> csrf.disable())
                .sessionManagement(session -> session.sessionCreationPolicy(org.springframework.security.config.web.server.SessionCreationPolicy.STATELESS))
                .authorizeExchange(exchange -> exchange
                        .pathMatchers("/api/1.0/auth/**", "/actuator/**", "/error").permitAll()
                        .anyExchange().authenticated()
                )
                .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));
        return http.build();
    }
}

2. 核对依赖配置

检查你的构建文件(pom.xml或build.gradle):

  • 只保留spring-cloud-starter-gateway,删掉spring-cloud-starter-gateway-mvc
  • 确保没有引入spring-boot-starter-web(MVC依赖),Gateway和MVC不能共存,否则会导致请求被DispatcherServlet接管,路由失效
  • 确保有spring-cloud-starter-securityspring-boot-starter-oauth2-resource-server依赖,支持反应式Security和OAuth2资源服务器

Maven依赖示例:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
    </dependency>
    <!-- Eureka客户端 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

3. 验证路由和服务注册

  • 打开Eureka控制台(http://localhost:8761),确认auth-service已经成功注册
  • 检查application.yaml里的路由配置,lb://auth-service对应服务名要和auth-service的spring.application.name一致,路径匹配规则Path=/api/1.0/auth/**要和请求URL匹配

4. 排查请求接管问题

如果还是出现静态资源找不到的错误,说明请求没走到Gateway:

  • 确认项目中确实没有spring-boot-starter-web依赖
  • Spring Boot 3.x版本下,确保spring-boot-starter-webflux被正确引入(Gateway依赖会自动带,但可以手动确认)

验证

  1. 重启Gateway,确保启动无报错
  2. 启动auth-service,确认在Eureka注册成功
  3. 用Postman请求http://localhost:8084/api/1.0/auth/login,此时请求应该被路由到auth-service,返回正常响应,不会再出现404或静态资源错误

内容的提问来源于stack exchange,提问作者ousmane MBINTE

火山引擎 最新活动