.Net Core 处理跨域问题
一、什么是跨域(源)
跨域指的是从一个域名下去请求另外一个不同的域名下的资源。
说明:跨域和跨源可以看作相同,只是用词不一样
二、为什么会有跨域(源)这个问题
原因:浏览器的同源策略导致了跨域(源)
同源策略说明:https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy
举例:http://www.a.com:8080/index.html
当协议(http、https)、域名(www.a.com)、端口号(8080)中任意一个不相同时,都算作不同域。
当浏览器页面在执行一个脚本时会检查访问的资源是否同源,如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。
URL | URL2 | 是否同域(源) | 原因 |
---|---|---|---|
http://www.a.com/index.html | http://www.a.com/index.html | 是 | 协议、域名、端口号都相同 |
http://www.a.com/index.html | http://www.a.com/login.html | 是 | 协议、域名、端口号都相同,说明index和login可以不同,也是同域 |
http://www.a.com/index.html | https://www.a.com/index.html | 否 | 不同协议 ( https和http ) |
http://www.a.com:/index.html | http://www.a.com:81/index.html | 否 | 不同端口 ( http://www.a.com:/index.html 默认80端口号) |
http://www.a.com/index.html | http://www.b.com/index.html | 否 | 不同域名 |
http://www.c.a.com/index.html | http://www.b.a.com/index.html | 否 | 不同域名,二级域名不同 |
http://localhost:8081/index.html | http://127.0.0.1:8081/index.html | 否 | 虽然localhost等同于 127.0.0.1 但是也是非同源的 |
同源策略限制内容有:
Cookie、LocalStorage、IndexedDB 等存储性内容
DOM 节点
AJAX 请求不能发送
但是有些标签是允许跨域加载资源:<img src=XXX> 2.<link href=XXX> 3.<script src=XXX> 3.<iframe src=XXX>
对于像 img、iframe、script 等标签的 src 属性是特例,它们是可以直接跨域访问资源的。
三、处理跨域的方法
跨域资源共享(CORS) :https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
1.说明:
(1)跨域资源共享标准有了一组 HTTP 头部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。
(2)对那些可能对服务器数据产生副作用的 HTTP 请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求,从而获知服务端是否允许该跨域请求。
服务器确认允许之后,才发起实际的 HTTP 请求。
(3)在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。
跨域请求可分为简单请求(只请求一次)和预检请求(请求两次,第一次:使用OPTIONS方法发起一个预检请求,第二次:当预检请求允许该跨域请求,再发起实际的HTTP请求)
四:NET Core 配置跨域
1.ConfigureServices中配置
//方法一:配置跨域处理,允许所有来源AllowAnyOrigin:
services.AddCors(options =>options.AddPolicy("自定义的跨域策略名称",policy => policy.AllowAnyOrigin()));
//方法二:允许一个或多个具体来源:
services.AddCors(options =>
{
//注意:自定义的跨域策略名称,必须和Configure中的UseCors的名称必须一致
options.AddPolicy("自定义的跨域策略名称", policy =>
{
//1.允许跨域的来源,多个跨域来源时可以使用`,` 分割, policy.WithOrigins("http://192.168.8.236:4444", "http://192.168.8.236:4445")
//2.多个跨域来源时可以使用string[]
string Origins = "http://192.168.8.236:4444,http://192.168.8.236:4445";
policy.WithOrigins(Origins.Split(','))
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
});
});
1.Configure中配置
//注意:1.必须位于UserMvc之前 2.自定义的跨域策略名称,必须和ConfigureServices中的AddPolicy的名称必须一致
app.UseCors("自定义的跨域策略名称");