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

为正常运行的Spring Boot应用添加Spring Security后图表加载失败排查

问题解决步骤

1. 放开图表接口的匿名访问权限

添加Spring Security后,所有请求默认会被拦截并重定向到登录页(返回302状态码),这是导致图表无法加载的核心原因。你需要在SecurityConfig里明确放开图表数据接口的匿名访问权限:

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                // 替换为你RestBarController的实际接口路径
                .requestMatchers("/api/bar-chart/**").permitAll()
                // 其他接口按需配置权限
                .anyRequest().authenticated()
            )
            .formLogin(form -> form.permitAll())
            .logout(logout -> logout.permitAll());
        
        return http.build();
    }
}

2. 配置Spring Security支持跨域

Access-Control-Allow-Origin错误是因为Spring Security默认拦截OPTIONS预检请求,且未添加跨域响应头。可以通过两种方式解决:

方式一:自定义CORS配置

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            // 启用CORS并关联自定义配置
            .cors(cors -> cors.configurationSource(corsConfigurationSource()))
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/bar-chart/**").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(form -> form.permitAll())
            .logout(logout -> logout.permitAll());
        
        return http.build();
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration config = new CorsConfiguration();
        // 替换为你的前端实际域名,比如http://localhost:8080
        config.setAllowedOrigins(Arrays.asList("http://localhost:8080"));
        config.setAllowedMethods(Arrays.asList("GET", "POST", "OPTIONS"));
        config.setAllowedHeaders(Arrays.asList("*"));
        // 若前端需要携带Cookie,开启此项
        config.setAllowCredentials(true);

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

方式二:使用全局CORS配置(已通过@CrossOrigin配置过的场景)

如果你的Controller已经用@CrossOrigin标注,只需在SecurityConfig里启用默认CORS并禁用CSRF(前后端分离场景常用):

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .cors(Customizer.withDefaults())
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/bar-chart/**").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin(form -> form.permitAll())
            .logout(logout -> logout.permitAll());
        
        return http.build();
    }
}

3. 验证效果

重启应用后,检查浏览器控制台:

  • 302重定向提示消失
  • 跨域相关错误不再出现
  • ChartJS能正常拉取数据并渲染图表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:42:13