亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

已被 CORS 策略阻止:對預檢請求的響應未通過訪問控制檢查

已被 CORS 策略阻止:對預檢請求的響應未通過訪問控制檢查

Go
慕的地8271018 2023-05-08 16:09:02
我已經創建了旅行服務器。它工作正常,我們可以POST通過 Insomnia 發出請求,但是當我們POST在前端通過 axios 發出請求時,它會發送錯誤:has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: It does not have HTTP ok status.我們對axios的要求:let config = {headers: {  "Content-Type": "application/json",  'Access-Control-Allow-Origin': '*',  }}let data = {  "id": 4 } axios.post('http://196.121.147.69:9777/twirp/route.FRoute/GetLists', data, config)   .then((res) => {      console.log(res)     })    .catch((err) => {      console.log(err)   });} 我的去文件:func setupResponse(w *http.ResponseWriter, req *http.Request) {    (*w).Header().Set("Access-Control-Allow-Origin", "*")    (*w).Header().Set("Access-Control-Allow-Methods", "POST,GET,OPTIONS, PUT, DELETE")    (*w).Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")}func WithUserAgent(base http.Handler) http.Handler {    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {    ctx := r.Context()    ua := r.Header.Get("Jwt")    ctx = context.WithValue(ctx, "jwt", ua)    r = r.WithContext(ctx)    setupResponse(&w, r)     base.ServeHTTP(w, r)  })}const (    host     = "localhost"    port     = 5432    user     = "postgres"    password = "postgres"    dbname   = "postgres")func main() {    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+           "password=%s dbname=%s sslmode=disable",               host, port, user, password, dbname)    server := &s.Server{psqlInfo}    twirpHandler := p.NewFinanceServiceServer(server, nil)    wrap := WithUserAgent(twirpHandler)      log.Fatalln(http.ListenAndServe(":9707", wrap))}正如我之前在 Insomnia 上所說的那樣,它工作得很好,但是當我們發出 axiosPOST請求時,在瀏覽器的控制臺上會出現以下內容:已被 CORS 策略阻止:對預檢請求的響應未通過訪問控制檢查:它沒有 HTTP 正常狀態。
查看完整描述

7 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

我相信這是最簡單的例子:


header := w.Header()

header.Add("Access-Control-Allow-Origin", "*")

header.Add("Access-Control-Allow-Methods", "DELETE, POST, GET, OPTIONS")

header.Add("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With")

您還可以添加標題Access-Control-Max-Age,當然您可以允許任何您想要的標題和方法。


最后你想回應最初的請求:


if r.Method == "OPTIONS" {

    w.WriteHeader(http.StatusOK)

    return

}

編輯(2019 年 6 月):我們現在為此使用大猩猩。他們的東西得到了更積極的維護,而且他們已經這樣做了很長時間。留下舊的鏈接,以防萬一。


下面的舊中間件推薦: 當然,為此使用中間件可能會更容易。我不認為我已經使用過它,但是這個似乎是強烈推薦的。


查看完整回答
反對 回復 2023-05-08
?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

這個答案解釋了幕后發生的事情,以及如何用任何語言解決這個問題的基礎知識。有關參考,請參閱有關此主題的 MDN 文檔。


您正在從一個域(比如 domain-a.com)上運行的 JavaScript 向另一個域(domain-b.com)上運行的 API 發出 URL 請求。當您這樣做時,瀏覽器必須詢問 domain-b.com 是否可以允許來自 domain-a.com 的請求。它通過一個 HTTP 請求來做到這一點OPTIONS。然后,在響應中,domain-b.com 上的服務器必須(至少)提供以下 HTTP 標頭,上面寫著“是的,沒關系”:


HTTP/1.1 204 No Content                            // or 200 OK

Access-Control-Allow-Origin: https://domain-a.com  // or * for allowing anybody

Access-Control-Allow-Methods: POST, GET, OPTIONS   // What kind of methods are allowed

...                                                // other headers

如果您使用的是 Chrome,您可以通過按 F12 并轉到“網絡”選項卡來查看 domain-b.com 上的服務器給出的響應,從而查看響應的樣子。


因此,回到@threeve 的原始答案的最低限度:


header := w.Header()

header.Add("Access-Control-Allow-Origin", "*")


if r.Method == "OPTIONS" {

    w.WriteHeader(http.StatusOK)

    return

}

這將允許任何人從任何地方訪問這些數據。由于其他原因,他包含的其他標頭是必需的,但這些標頭是通過 CORS(跨源資源共享)要求的最低要求。


查看完整回答
反對 回復 2023-05-08
?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

CORS 問題應該在后端修復。臨時解決方法使用此選項。

  1. 打開命令提示符

  2. 導航到 chrome 安裝位置輸入cd "c:\Program Files (x86)\Google\Chrome\Application" OR cd "c:\Program Files\Google\Chrome\Application"

  3. 執行命令chrome.exe --disable-web-security --user-data-dir="c:/ChromeDevSession"

使用上述選項,您可以在沒有安全保護的情況下打開新的 chrome。這個 chrome 不會拋出任何 cors 問題。

http://img1.sycdn.imooc.com//6458ae500001790a13200238.jpg

查看完整回答
反對 回復 2023-05-08
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

對于尚未找到解決方案的任何人,如果您正在使用:

  1. AWS HTTP API 網關;

  2. 您正在使用帶有身份驗證的任何方法進行路由和 lambda 集成;

  3. 您認為您已經正確配置了 CORS;

該錯誤是因為瀏覽器正在向您的路由發送預檢 OPTIONS 請求而沒有 Authentication 標頭,因此無法獲得 CORS 標頭作為響應。

為了解決這個問題,我在沒有身份驗證的情況下為 OPTIONS 方法添加了另一條路線,并且 lambda 集成僅返回 { statusCode: 200 };


查看完整回答
反對 回復 2023-05-08
?
弒天下

TA貢獻1818條經驗 獲得超8個贊

在 WebService 應用程序中啟用 CORS。首先,添加 CORS NuGet 包。在 Visual Studio 中,從工具菜單中選擇 NuGet 包管理器,然后選擇包管理器控制臺。在包管理器控制臺窗口中,鍵入以下命令:


Install-Package Microsoft.AspNet.WebApi.Cors

此命令安裝最新的包并更新所有依賴項,包括核心 Web API 庫。使用 -Version 標志來定位特定版本。CORS 包需要 Web API 2.0 或更高版本。


打開文件 App_Start/WebApiConfig.cs。將以下代碼添加到 WebApiConfig.Register 方法:


using System.Web.Http;

namespace WebService

{

? ? public static class WebApiConfig

? ? {

? ? ? ? public static void Register(HttpConfiguration config)

? ? ? ? {

? ? ? ? ? ? // New code

? ? ? ? ? ? config.EnableCors();


? ? ? ? ? ? config.Routes.MapHttpRoute(

? ? ? ? ? ? ? ? name: "DefaultApi",

? ? ? ? ? ? ? ? routeTemplate: "api/{controller}/{id}",

? ? ? ? ? ? ? ? defaults: new { id = RouteParameter.Optional }

? ? ? ? ? ? );

? ? ? ? }

? ? }

}

接下來,將 [EnableCors] 屬性添加到您的控制器/控制器方法


using System.Net.Http;

using System.Web.Http;

using System.Web.Http.Cors;


namespace WebService.Controllers

{

? ? [EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]

? ? public class TestController : ApiController

? ? {

? ? ? ? // Controller methods not shown...

? ? }

}


查看完整回答
反對 回復 2023-05-08
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

Angular 和 Django Rest 框架。

我在向我的 DRF api 發出發布請求時遇到了類似的錯誤。碰巧我所缺少的只是端點的尾部斜杠


查看完整回答
反對 回復 2023-05-08
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

這里提供的解決方案是正確的。但是,同樣的錯誤也可能發生在用戶錯誤中,即您的端點請求方法與您在發出請求時使用的方法不匹配。

例如,當您將方法請求為 POST 時,服務器端點使用“RequestMethod.PUT”定義。


查看完整回答
反對 回復 2023-05-08
  • 7 回答
  • 0 關注
  • 6300 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號