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

Spring Boot+Angular部署AWS后部分设备出现CORS错误求助

问题场景
  • 后端:基于Corretto 17的Elastic Beanstalk环境,部署Spring Boot应用
  • 前端:部署在独立S3桶的Angular应用
  • 异常现象:同网络下,部分Win10电脑调用/api/login、/api/register接口时触发CORS错误,但Win7电脑、手机及另一部分电脑可正常操作
  • 已尝试方案:
    • 在Spring Security配置中设置CORS规则
    • 配置存储后端的S3桶CORS策略
    • 在UserController类上添加@CrossOrigin注解

相关代码片段

UserController核心代码

@RestController
@RequestMapping("/api")
public class UserController {
...
    @PostMapping("/login")
    public LoginResponse loginUser(@RequestBody UserDto userDto) {
        return userService.loginUser(userDto);
    }
}

Spring Security CORS配置

@Configuration
@EnableWebSecurity
public class SecurityConfig {

...

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .cors(withDefaults())
                .csrf(AbstractHttpConfigurer::disable)
                .authorizeHttpRequests(request -> request
                        .requestMatchers(POST, "/api/register").permitAll()
                        .requestMatchers(GET, "/api/register/confirm**").permitAll()
                        .requestMatchers(POST, "/api/login").permitAll()
                        .anyRequest().authenticated())
                .sessionManagement(session -> session.sessionCreationPolicy(STATELESS))
                .authenticationProvider(authenticationConfig.authenticationProvider())
                .addFilterBefore(jsonWebTokenFilter, UsernamePasswordAuthenticationFilter.class);
        return http.build();
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.addAllowedOrigin("*");
        configuration.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type", "Accept"));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
        configuration.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

存储后端的S3桶CORS配置

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "POST",
            "GET",
            "PUT",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": []
    }
]

Angular UserService核心代码

export class UserService {
  private baseUrl = 'http://mybook.eu-north-1.elasticbeanstalk.com/api';
...
  login(user: any): Observable<any> {
    return this.httpClient.post(`${this.baseUrl}/login`, user);
  }
}
排查与解决方法
  1. 清除浏览器缓存与站点数据
    部分Win10浏览器可能缓存了旧的CORS响应规则或会话凭证,导致请求校验失败。操作:

    • 打开浏览器设置,清除最近的缓存、Cookie及站点数据
    • 重启浏览器后重新测试接口
  2. 禁用浏览器CORS类插件
    各类CORS解锁插件可能会篡改请求头或干扰浏览器的原生CORS校验逻辑,引发异常。操作:

    • 进入浏览器扩展管理页面,禁用所有CORS相关插件
    • 关闭浏览器后重新打开测试
  3. 检查Win10系统代理设置
    Win10的自动代理或手动配置的代理可能会修改请求的Origin头,导致后端CORS校验不通过。操作:

    • 打开「设置」→「网络和Internet」→「代理」
    • 关闭「自动检测设置」,并清空手动配置的代理地址
    • 重启浏览器后测试
  4. 验证请求的Origin头
    用浏览器开发者工具(F12)检查请求头:

    • 切换到「网络」标签,找到/login请求,查看请求头中的Origin值是否为前端S3桶的域名
    • 若Origin值异常,检查前端部署配置,确保请求从正确的前端域名发起
  5. 优化Spring Boot CORS配置
    当allowCredentials=true时,部分浏览器对*作为AllowedOrigin的兼容存在问题,建议修改为具体的前端域名:

    // 替换为你的前端S3桶域名
    configuration.addAllowedOrigin("https://your-frontend-bucket.s3.eu-north-1.amazonaws.com");
    // 若需要支持多个域名,可多次调用addAllowedOrigin
    // configuration.addAllowedOrigin("https://another-domain.com");
    

    同时添加必要的暴露头(如果接口返回Token等自定义头):

    configuration.addExposedHeader("Authorization");
    
  6. 检查Elastic Beanstalk负载均衡器配置
    若环境使用了负载均衡器,需确保请求头(尤其是Origin、Host)被正确转发到后端:

    • 进入AWS控制台的Elastic Beanstalk环境,查看负载均衡器的监听器规则,确认没有拦截或修改CORS相关请求头

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:20:08