gpt4 book ai didi

xmlhttprequest - CORS 请求已预检,但似乎不应该

转载 作者:行者123 更新时间:2023-12-03 21:39:07 25 4
gpt4 key购买 nike

以下跨源 POST 请求,内容类型为 multipart/form-data 并且仅预检简单的 header 。根据 W3C 规范,除非我读错了,否则不应进行预检。我已经确认在 Chrome 27 和 Firefox 10.8.3 中会发生这种情况。我没有测试任何其他浏览器。

这是请求 header 等:

Request URL:http://192.168.130.135:8081/upload/receiver
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:27129
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryix5VzTyVtCMwcNv6
Host:192.168.130.135:8081
Origin:http://192.168.130.135:8080
Referer:http://192.168.130.135:8080/test/raytest-jquery.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.37 Safari/537.36

这是 OPTIONS(预检)请求:
Request URL:http://192.168.130.135:8081/upload/receiver
Request Method:OPTIONS
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, content-type
Access-Control-Request-Method:POST
Connection:keep-alive
Host:192.168.130.135:8081
Origin:http://192.168.130.135:8080
Referer:http://192.168.130.135:8080/test/raytest-jquery.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.37 Safari/537.36

规范似乎很清楚:
  • 只有 simple headers : 检查
  • 只有 simple methods : 检查

  • 更新:下面是一些简单的客户端代码,可以重现这一点:

    var xhr = new XMLHttpRequest(),
    formData = new FormData();

    formData.append('myfile', someFileObj);

    xhr.upload.progress = function(e) {
    //insert upload progress logic here
    };

    xhr.open('POST', 'http://192.168.130.135:8080/upload/receiver', true);
    xhr.send(formData);

    有谁知道为什么这是预检?

    最佳答案

    我最终查看了 Webkit 源代码以试图解决这个问题(在 Google 没有产生任何有用的点击之后)。事实证明,只要您注册 onprogress,Webkit 就会强制对任何跨域请求进行预检。事件处理程序。即使在阅读了代码注释之后,我也不完全确定为什么要应用这种逻辑。

    在 XMLHttpRequest.cpp 中:

    void XMLHttpRequest::createRequest(ExceptionCode& ec)
    {
    ...

    options.preflightPolicy = uploadEvents ? ForcePreflight : ConsiderPreflight;

    ...

    // The presence of upload event listeners forces us to use preflighting because POSTing to an URL that does not
    // permit cross origin requests should look exactly like POSTing to an URL that does not respond at all.
    // Also, only async requests support upload progress events.
    bool uploadEvents = false;
    if (m_async) {
    m_progressEventThrottle.dispatchEvent(XMLHttpRequestProgressEvent::create(eventNames().loadstartEvent));
    if (m_requestEntityBody && m_upload) {
    uploadEvents = m_upload->hasEventListeners();
    m_upload->dispatchEvent(XMLHttpRequestProgressEvent::create(eventNames().loadstartEvent));
    }
    }

    ...
    }

    更新: Firefox 应用与 Webkit 相同的逻辑,它出现了。这是来自 nsXMLHttpRequest.cpp 的相关代码:

    nsresult
    nsXMLHttpRequest::CheckChannelForCrossSiteRequest(nsIChannel* aChannel)
    {
    ...

    // Check if we need to do a preflight request.
    nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(aChannel);
    NS_ENSURE_TRUE(httpChannel, NS_ERROR_DOM_BAD_URI);

    nsAutoCString method;
    httpChannel->GetRequestMethod(method);
    if (!mCORSUnsafeHeaders.IsEmpty() ||
    (mUpload && mUpload->HasListeners()) ||
    (!method.LowerCaseEqualsLiteral("get") &&
    !method.LowerCaseEqualsLiteral("post") &&
    !method.LowerCaseEqualsLiteral("head"))) {
    mState |= XML_HTTP_REQUEST_NEED_AC_PREFLIGHT;
    }

    ...
    }

    请注意 mUpload && mUpload->HasListeners()有条件的部分。

    似乎 Webkit 和 Firefox(可能还有其他)已经在他们的预检确定代码中插入了一些不受 W3C 规范认可的逻辑。如果我在规范中遗漏了某些内容,请发表评论。

    关于xmlhttprequest - CORS 请求已预检,但似乎不应该,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17057303/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com