如何处理预检请求?

Posted

技术标签:

【中文标题】如何处理预检请求?【英文标题】:How to handle preflight request? 【发布时间】:2021-05-11 19:38:12 【问题描述】:

我正在尝试向支持 cors 策略的不同源服务器发送发布请求。

问题是content-type:application/json.CORS 飞行前请求(OPTIONS 调用)不能是这个 Content-Type。 我还有另一个选项可以使用我的标头发送:Access-Control-Request-Headers: content-type,deviceid,devicepassword,deviceversion

my network header

有没有办法获取数据? 我正在使用 react.js 和 asp.net core 编写的后端服务

【问题讨论】:

【参考方案1】:

希望这能解决问题。

public void ConfigureServices(IServiceCollection services)


    services.AddCors(options => options.AddPolicy(Global.CORS_ALLOW_ALL_POLICY_NAME,
            builder =>
            
                builder.AllowAnyOrigin()
                    .AllowAnyHeader()
                    .AllowAnyMethod()
                    .AllowCredentials();
            ));

    services.AddMvc();


// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    if (env.IsDevelopment())
    
        app.UseDeveloperExceptionPage();
    
    else
    
        app.UseHsts();
    

    app.UseCors(Global.CORS_ALLOW_ALL_POLICY_NAME);

    app.UseHttpsRedirection();
    app.UseMvc();

【讨论】:

谢谢,但我以前做过。我知道与预检有关的问题。【参考方案2】:

如果传递自定义头部,则需要添加指定的请求头部。

     services.AddCors(option=>
        
            option.AddPolicy("policyname", builder => 
                builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod();
        );

删除credentials: 'include'

另一种方法:不要删除credentials: 'include'。在bakend中添加AllowCredentials

    services.AddCors(option=>
        
            option.AddPolicy("policyname", builder => 
                builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials();
        );

【讨论】:

是的,谢谢你的观点,我添加它。 .WithExposedHeaders("Accept","Content-Type","DeviceVersion","DeviceID","DevicePassword") 但仍然 fetch 不起作用! @卡尼 @E.Shahri,在客户端怎么弄的,可以分享一些客户端代码吗? `fetch("Url", mode: 'cors', credentials: 'include', method: 'POST', body: JSON.stringify( phoneNumber: Number, ), headers: "Accept": "application/json", "Content-Type": "application/json", "DeviceVersion": "", "DeviceID": "", "DevicePassword": "", , )` @卡尼 @E.Shahri,您要将这些标头发送到 bakend 吗? 是的。我应该将这些标头发送到后端@Karney

以上是关于如何处理预检请求?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data REST CORS - 如何处理预检选项请求?

如何处理从 servlet 中的 Angular 应用程序发送的预检请求?

Cors - 如何处理需要自定义标头的预检选项请求? (AWS:使用 vpc 端点的私有 API 网关)

一般如何处理 CXF 请求处理程序中的输入参数?

如何处理高并发量的HTTP请求

Nginx 是如何处理 HTTP 头部的?