6

我正在使用 Sencha Touch 2.1.0。我正在进行 HTTP GET 调用。这是一个 CORS 请求。因此它按预期发送 Pre-flight HTTP OPTIONS 命令。

我已经在我的服务器上安装了 CORS 过滤器并进行了配置。直到昨天,来自我的代码的调用都进行得很好。今天突然停止加载数据。当我在 Chrome 中检查网络调用时,我看到 OPTIONS 方法显示为“已取消加载”

方法:OPTIONS
状态文本:“Load cancelled”
类型:pending
发起者:Connection.js:319

我第一次配置 CORS 过滤器时遇到了类似的问题。当我清除浏览器缓存时,它开始工作。这一次,我不知道为什么它突然停止工作了。即使我清除浏览器中的缓存和历史记录,它也没有得到修复。

如果我在 Firefox 中从 HTTPRequestor 进行相同的调用,效果会非常好。这是电话。由于保密原因,我屏蔽了网址。

OPTIONS http://myurl/rest/items?_dc=1358304888220&page=1&start=0&limit=25 HTTP/1.1
Access-Control-Request-Method: GET
Origin: http://localhost:8080
Access-Control-Request-Headers: accept, origin, x-requested-with

相同的请求给了我来自 HTTPRequestor 的非常好的响应。结果如下:

OPTIONS http://myurl/rest/items?_dc=1358304888220&page=1&start=0&limit=25
Access-Control-Request-Headers: accept, origin, x-requested-with
Access-Control-Request-Method: GET
Origin: http://localhost:8080


 -- response --
200 OK
Date:  Wed, 16 Jan 2013 03:19:27 GMT

Server:  Apache-Coyote/1.1

Access-Control-Allow-Origin:  http://localhost:8080

Access-Control-Allow-Credentials:  true

Access-Control-Allow-Methods:  HEAD, GET, POST, OPTIONS

Access-Control-Allow-Headers:  X-Requested-With, Origin, Accept, Content-Type

Content-Length:  0

Strict-Transport-Security:  max-age=15768000, includeSubDomains

Keep-Alive:  timeout=15, max=100

Connection:  Keep-Alive

商店中的 Sencha 代码进行此调用:

    proxy: {
        type: 'ajax',
        method: 'GET',
        url: 'http://myurl/rest/items',
        withCredentials: true,
        useDefaultXhrHeader: false,
        disableCaching: false,
        headers: {
            "Accept": "application/json"
        },
        failure: function(response) {
            if (response.timedout) {
                Ext.Msg.alert('Timeout', "The server timed out :(");
            } else if (response.aborted) {
                Ext.Msg.alert('Aborted', "Looks like you aborted the request");
            } else {
                Ext.Msg.alert('Bad', "Something went wrong with your request");
            }
        },
        success: function(response){
            Ext.Msg.alert(response.responseText);
        }
    },
    autoLoad: true,

请帮助我了解如何解决此问题。

4

3 回答 3

2

由于上次 Google Chrome 更新,这似乎是一个问题。当我尝试使用 Iron 浏览器时,它可以工作。

于 2013-01-23T02:38:24.793 回答
0

我在 Webkit 浏览器的 beta 版本中遇到了类似的问题。事实证明,Content-Type为包含 Blob 的 XMLHttpRequests 隐式设置了标头,因此我必须将其添加到Access-Control-Allow-Headers我的上传服务器上。

见:https ://bugs.webkit.org/show_bug.cgi?id=99983

于 2013-02-05T17:01:47.233 回答
0

我刚刚解决了这个问题。服务器响应标头应设置为:

"Access-Control-Allow-Origin": "*"
"Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept"

你已经这样做了。我认为如果 GET 或 POST 方法包含 X-Requested-With 标头,则将首先发送 OPTIONS 方法。X-Requested-With 标头在默认的 XHR 标头中。所以我们应该将'useDefaultXhrHeader'设置为false。Ext.data.Store 不支持此参数。编辑 sdk/src/data/Connection.js,将 useDefaultXhrHeader 的默认值更改为 false。

于 2014-02-07T15:53:27.190 回答