什麼是跨域?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