【问题标题】:jQuery CORS GET is successfull but firebug still displays it in redjQuery CORS GET 成功,但萤火虫仍以红色显示
【发布时间】:2012-11-23 06:27:36
【问题描述】:

我想使用 jQuery v1.8.3 进行跨域 GET ajax 请求。

这是我的设置:

  1. 我在 domain1.dev 上有一台服务器,它为 每个 请求发出这些 CORS 标头:

    • Access-Control-Allow-Origin: *
    • Access-Control-Allow-Credentials: true
    • Access-Control-Allow-Methods: *
    • Access-Control-Allow-Headers: *
  2. 我在domain2.dev 上有一个Web 应用程序,它从domain1.dev 加载一个名为domain1.js 的javascript。

    在这个domain1.js 文件中,我发出这个AJAX 请求:

    jQuery.ajax('http://domain1.dev/path', {
        headers: {'Accept': 'application/json'},
        xhrFields: {
            withCredentials: true
        },
        statusCode: {
            200: function(data, textStatus, jqXHR) {
                // some logic
            },
            401: function(data, textStatus, jqXHR) {
                // some other logic
            }
        }
    })
    
  3. 我从domain2.dev 加载页面。 AJAX 请求已发出(没有预检)并且成功(状态代码 200)但 firebug 仍将其显示为红色(chrome 显示“已取消”),我不明白为什么。

有什么想法吗?

编辑:

domain1.dev发送的响应头:

Access-Control-Allow-Cred...    true
Access-Control-Allow-Head...    Accept, Accept-Encoding, Accept-Language,    Connection, Cookie, Host, Origin, Referer, User-Agent
Access-Control-Allow-Meth...    GET
Access-Control-Allow-Orig...    *
Cache-Control   private
Connection  keep-alive
Content-Type    application/json
Date    Thu, 22 Nov 2012 22:24:44 GMT
Server  nginx/1.2.3
Transfer-Encoding   chunked
X-Powered-By    PHP/5.4.6
x-debug-token   50aea62c91ee6

虽然请求标头是:

Accept  application/json
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Cookie  obfuscated=uk40mmmqbffues5cpn6omj6mf0; __utma=126865951.1486960365.1353615466.1353615466.1353619027.2; __utmz=126865951.1353615466.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=126865951
Host    domain1.dev:8080
Origin  http://domain2.dev:8080
Referer http://domain2.dev:8080/app_dev.php
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:17.0) Gecko/17.0 Firefox/17.0

【问题讨论】:

    标签: jquery ajax cors


    【解决方案1】:

    在后端,您必须明确说明您希望允许哪些标头和方法。 Access-Control-Allow-MethodsAccess-Control-Allow-Headers 响应标头不支持通配符。

    如果您想允许任何方法/标头,只需在(预检)请求中查找 Access-Control-Request-MethodsAccess-Control-Request-Headers 标头,并返回文字值。

    而且,当withCredentials 为真时,您不能对Access-Control-Allow-Origin 使用通配符。要么使用前面描述的相同机制来模拟通配符,要么不使用withCredentials

    【讨论】:

    • 以下设置仍然失败:Access-Control-Allow-Methods: GETAccess-Control-Allow-Headers: Accept, Accept-Encoding, Accept-Language, Connection, Cookie, Host, Origin, Referer, User-Agent
    • @futurecat 标头必须存在于预检和实际请求中。是这样吗?
    • @futurecat 更新了答案(对于简单的请求,预检是可选的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多