401 响应 CORS preflight OPTIONS 请求到 Spring Boot 服务器

Posted

技术标签:

【中文标题】401 响应 CORS preflight OPTIONS 请求到 Spring Boot 服务器【英文标题】:401 response for CORS preflight OPTIONS request to springboot server 【发布时间】:2021-02-22 05:20:53 【问题描述】:

从我的 Angular 应用程序到 Spring Boot 后端的跨域请求被 CORS 阻止,仅使用 POST、PUT。允许 GET 并按预期工作。

这是我的配置..

后端:

cors 过滤器 -

@Configuration
public class CORSConfiguration 

    @Bean
    public CorsFilter corsFilter() 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();

        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
        corsConfiguration.setAllowedMethods(Arrays.asList("PUT", "POST", "GET", "DELETE", "OPTIONS"));
        corsConfiguration.setAllowedHeaders(Arrays.asList("Origin", "X-Requested-With", "X-Requested-By",
                "Content-Type", "Accept", "Authorization"));
        source.registerCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(source);
    

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter 
@Override
    protected void configure(HttpSecurity httpSecurity) throws Exception 
        httpSecurity.cors().and()
                    .csrf().disable()
                    .authorizeRequests()
                    .antMatchers(HttpMethod.OPTIONS).permitAll()
                    .antMatchers("/*").authenticated().and()
                    .jee().mappableAuthorities("xxxxxxx");

    

ng:

public postIT(payload: Data): Observable<Data> 
    return this.http.post<Data>(url, payload) , 
      withCredentials: true
    );
  

错误:

我在这里遗漏了什么?请告诉我。

【问题讨论】:

具体问题是服务器响应 CORS 预检 OPTIONS 请求时出现 401 错误 - 显然是因为它需要对路由甚至 OPTIONS 请求进行身份验证。解决方法是必须更改服务器配置,以便它允许未经身份验证的 OPTIONS 请求,并以 200 OK 响应它们。在***.com/a/45406085/441757查看答案 对,我已经允许 OPTIONS req 绕过身份验证。通过设置:.antMatchers(HttpMethod.OPTIONS,"/**").permitAll() 显然绕过不足以阻止该路由允许未经身份验证的 OPTIONS 请求。否则,您将不会收到对 OPTIONS 请求的 401 响应。 i.stack.imgur.com/9ojsO.jpg 处的图片绝对表明您收到了对 OPTIONS 请求的 401 响应。 【参考方案1】:

您能否尝试将“AllowedHeaders”替换为以下列表:

“Access-Control-Allow-Credentials”、“Content-Type”、“Access-Control-Allow-Headers”、“X-Requested-With”、“Origin”、“Accept”

【讨论】:

只是为了理解的目的,请您解释一下为什么这会有所帮助。 “Access-Control-Allow-Credentials”标头告诉浏览器是否在请求的凭据模式下将响应暴露给前端 javascript 代码。浏览器在发出预检请求时使用“Access-Control-Request-Headers”标头,让服务器知道客户端在发出实际请求时可能会发送哪些 HTTP 标头。 以上方法都试过了,问题依旧。【参考方案2】:

我犯的错误是在 web.xml 中,其中 OPTIONS 包含在 &lt;security-constraint&gt; 元素中。

从这里删除它,其余配置保持不变,我不再看到问题。

【讨论】:

以上是关于401 响应 CORS preflight OPTIONS 请求到 Spring Boot 服务器的主要内容,如果未能解决你的问题,请参考以下文章

CORS preflight OPTIONS 请求从 Windows Authenticated web api 返回 401(未授权)

Express 服务器和 Axios CORS Preflight 响应不成功

CORS Preflight 响应包括 Vary:Origin 和 Access-Control-Max-Age?

对 CORS preflight OPTIONS 请求的响应是 Laravel API 中的 500 Internal Server Error

[CORS][Spring Security] PreFlight 请求未处理

Axios CORS/Preflight 因 Laravel 5.4 API 调用而失败