由 CORS 阻止的 Spring Boot 自定义响应标头

Posted

技术标签:

【中文标题】由 CORS 阻止的 Spring Boot 自定义响应标头【英文标题】:Spring boot custom response header blocked by CORS 【发布时间】:2020-09-10 04:24:52 【问题描述】:

我有提供 GET REST API 端点到对象列表的 Spring Boot 应用程序。该列表具有默认分页,并提供自定义“链接”HTTP 标头,其中包含基于导航中当前页面的下一页和上一页的信息,供客户端使用。

链接 HTTP 标头示例

link: <http://localhost:8080/api/v1/articles?page=1&size=1>; rel="next", <http://localhost:8080/api/v1/articles?page=4&size=1>; rel="last"' 

当客户端和 Web 服务器使用相同的来源时,将包含标头。但是,当客户端具有不同的来源时,我无法在响应标头中包含链接标头。该应用程序具有 CORS 配置,但我找不到任何使其包含我的自定义标头的内容。仅包含默认响应标头。

知道如何在 CORS 响应中包含自定义 HTTP 标头吗?

 @Configuration
 @EnableWebSecurity
 public class SecurityConfig extends WebSecurityConfigurerAdapter 

    @Bean
    public SpringDataUserDetailsService customUserDetailsService() 
        return new SpringDataUserDetailsService();
    

    @Bean
    public BCryptPasswordEncoder passwordEncoder() 
        return new BCryptPasswordEncoder();
    

    @Bean
    CorsConfigurationSource corsConfigurationSource() 
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("*"));
        configuration.setAllowedMethods(Arrays.asList("*"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowCredentials(true);
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.cors().and().csrf().disable();

        http.authorizeRequests()
            .antMatchers("/").permitAll()
            .antMatchers("/admin").authenticated().and().formLogin();
    
 

-- 编辑 1--

Response headers when the client is of the same origin as web server

Response headers when the client is on the other port

【问题讨论】:

我添加了 -- EDIT 1 -- 当客户端在同一个端口(同源)和不同端口时,带有响应头的屏幕截图。 查看 Spring Security 的DefaultCorsProcessor 的调试日志。如果是 CORS 问题,您应该在那里阅读。 两个请求都得到 200 吗?还是你得到了 401? 两个请求的状态都是 200。 【参考方案1】:

我找到了解决问题的方法。自定义标头必须在 CorsConfigurationSource bean 中公开。 添加这行代码,允许跨域请求获取自定义标头“链接”作为响应。

configuration.addExposedHeader("Link");

【讨论】:

以上是关于由 CORS 阻止的 Spring Boot 自定义响应标头的主要内容,如果未能解决你的问题,请参考以下文章

Java Spring Boot Webflux cors 被阻止

Angular 6 + Spring Boot:错误:“来自原点 'http://localhost:4200' 已被 CORS 策略阻止”

Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest

使用 axios 从 react js 调用 Spring Boot get 方法时,浏览器显示“请求已被 CORS 策略阻止”

Spring Security CORS:来源已被 CORS 策略阻止

Spring Boot - 如何在 REST 控制器 HTTP PUT 上允许 CORS