什么是跨域?javascript
跨域,指的是浏览器不能执行其余网站的脚本。它是由浏览器的同源策略形成的,是浏览器对JavaScript施加的安全限制。php
所谓同源是指,域名,协议,端口均相同,不明白不要紧,举个栗子:html
http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域)前端
http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不一样:123/456,跨域)java
http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不一样:abc/def,跨域)jquery
http://www.123.com:8080/index.html 调用 http://www.123.com:8081/server.php (端口不一样:8080/8081,跨域)ajax
http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不一样:http/https,跨域)json
请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。后端
浏览器执行javascript脚本时,会检查这个脚本属于哪一个页面,若是不是同源页面,就不会被执行。api
你能够理解为两个域名之间不能跨过域名来发送请求或者请求数据,不然就是不安全的,这种不安全也就是CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
一张图解释什么是CSRF
跨域解决方案
能够参考这篇文章:
https://www.cnblogs.com/wennice/p/7150461.html
因为我后端用的是.net core api (.net core 2.2)在开发,开发中遇到的坑,记录一下
最开始设置容许跨域,按网上的方法
在Startup 下 ConfigureServices 添加以下代码,就是设置容许任何请求方法和网站跨域访问
// 添加跨域访问 services.AddCors(options => options.AddPolicy("AllowAnyOrigin", builder => builder.WithOrigins("*").AllowAnyMethod().AllowAnyHeader().AllowAnyOrigin().AllowCredentials()));
在Configure 方法 使用刚刚的配置项:
app.UseCors("AllowAnyOrigin");
发现控制器不抛异常,能够跨域访问,抛了异常 进入全局异常中间件里面 ExceptionMiddleWare.cs
private static async Task WriteExceptionAsync(HttpContext context, Exception exception) { //返回友好的提示 var response = context.Response; //状态码 response.StatusCode = (int)HttpStatusCode.OK; response.ContentType = context.Request.Headers["Accept"]; response.ContentType = "application/json"; ApiResponseInfo apiResponse = new ApiResponseInfo(); if (exception is ApiBaseException) { //用户定义异常 apiResponse.StatusCode = (exception as ApiBaseException).StatusCode; apiResponse.MessageText = (exception as ApiBaseException).MessageText; } else { apiResponse.StatusCode = "100000"; apiResponse.MessageText = StatusCodesConfig.GetRemark(apiResponse.StatusCode); Log.LoggerUnit.Logger.WriteError("未知异常:", exception); } await response.WriteAsync(JsonConvert.SerializeObject(apiResponse)).ConfigureAwait(false); }
app.UseCors("AllowAnyOrigin"); 配置没有生效,跨域的功能没有了,前端ajax post 请求一直提示跨域问题报
Access to XMLHttpRequest at 'https://localhost:44357/api/**/GetPaging' from
origin 'http://127.0.0.1:5500' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No
'Access-Control-Allow-Origin' header is present on the requested resource.
最后发现是以前设置了HTTP重定向app.UseHttpsRedirection();
没有生效 须要设置HTTPS 的跨域功能,代码以下:
app.UseHttpsRedirection().UseCors(builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
//或者
app.UseHttpsRedirection().UseCors("AllowAnyOrigin");
以后jquery.ajax 就能够访问了。
参考
https://www.cnblogs.com/wennice/p/7150461.html