避免使用CORS预检OPTIONS以获得更好的性能

时间:2017-02-18 09:56:47

标签: javascript jquery ajax http cors

使用CDN提供程序并从CDN调用静态HTML文件。

          $.ajax({
            url : CDNPATH,
            type : "GET",
            contentType : "text/plain; charset=utf-8",
            async : async,
            cache : true,
            processData : false,
            success : function(response, status, xhr) {
                onSuccess(response, status, xhr);
                $(document).trigger('contentReady');
            }
        });

在应用程序的主页上,我有5个静态HTML文件,可以触发5个OPTION调用。你可以想象,它会伤害性能。我已经看到类似的问题,使用GET方法和text/plain可以避免这种情况,我在上面做了但是它没有用。

如何避免这些预检OPTIONS方法?

1 个答案:

答案 0 :(得分:3)

也许charset param的存在导致了预检?按规格,浏览器是required to ignore any params and only consider the MIME type,但也许它们不符合。

  

CORS-safelisted请求标头是名称为

之一的标头      
      
  • Accept
  •   
  • Accept-Language
  •   
  • Content-Language
  •   
  • Content-Type,其值经解析后,具有application/x-www-form-urlencodedmultipart/form-datatext/plain
  • 的MIME类型(忽略参数)   

另外,我没有看到你的请求会引发预检。也许我错过了什么......

更新2017-02-20

根据information provided in a comment above确定,该网站的来源似乎包含一个包含此内容的script元素:

window["_tsbp_"] = { ba : "X-TS-BP-Action", bh : "X-TS-AJAX-Request"};

...而且我没有逐步完成代码的其余部分,看看它有什么影响,但它似乎导致X-TS-AJAX-Request标头被添加到XHR请求中,从而触发预检。

我想这里的一般内容是:每当您发现某个请求触发浏览器进行预检但您不知道原因时,故障排除步骤编号应该是使用您的浏览器devtools来确切了解哪些请求您的代码导致发送的标头。