NET Core接口跨域问题
一、什么是跨域
跨域问题来源于JavaScript的"同源策略",即只有 协议+主机名+端口号 (如存在)相同,则允许相互访问。也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源。跨域问题是针对JS和ajax的,html本身没有跨域问题。
查看浏览器开发者工具Console报错:
Failed to load http://a.a.com:8080/A/FromServlet?userName=123: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://b.b.com:8080' is therefore not allowed access.
http://www.abc.com/a/b 调用 http://www.abc.com/d/c(非跨域)
http://www.abc.com/a/b 调用 http://www.def.com/a/b (跨域:域名不一致)
http://www.abc.com:8080/a/b 调用 http://www.abc.com:8081/d/c (跨域:端口不一致)
http://www.abc.com/a/b 调用 https://www.abc.com/d/c (跨域:协议不同)
请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。
三、解决方案
接口跨域(接口跨域的话在Startup.cs文件中配置)
private const string _defaultCorsPolicyName = "localhost";
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(option =>
option.AddPolicy(_defaultCorsPolicyName, policy =>
policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin())
);
}
AllowAnyHeader()--确保策略允许任何标头。
AllowAnyMethod()-- 确保策略允许任何方法。
AllowAnyOrigin()--确保策略允许任何来源。
AllowCredentials()-- 将策略设置为允许凭据。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseCors(_defaultCorsPolicyName);//启动 _defaultCorsPolicyName的程序!
}