如何处理预检请求?
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 应用程序发送的预检请求?