Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 跨源请求被阻止_Ajax_Google App Engine_Go_Cors_Firefox Os - Fatal编程技术网

Ajax 跨源请求被阻止

Ajax 跨源请求被阻止,ajax,google-app-engine,go,cors,firefox-os,Ajax,Google App Engine,Go,Cors,Firefox Os,所以我有一个GoHTTP处理程序,它将一些POST内容存储到数据存储中,并作为响应检索一些其他信息。在后端,我使用: func handleMessageQueue(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") if r.Method == "POST" { c := appengine.NewContext(r)

所以我有一个GoHTTP处理程序,它将一些POST内容存储到数据存储中,并作为响应检索一些其他信息。在后端,我使用:

func handleMessageQueue(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    if r.Method == "POST" {

        c := appengine.NewContext(r)

        body, _ := ioutil.ReadAll(r.Body)

        auth := string(body[:])
        r.Body.Close()
        q := datastore.NewQuery("Message").Order("-Date")

        var msg []Message
        key, err := q.GetAll(c, &msg)

        if err != nil {
            c.Errorf("fetching msg: %v", err)
            return
        }

        w.Header().Set("Content-Type", "application/json")
        jsonMsg, err := json.Marshal(msg)
        msgstr := string(jsonMsg)
        fmt.Fprint(w, msgstr)
        return
    }
}
在我的firefox OS应用程序中,我使用:

var message = "content";

request = new XMLHttpRequest();
request.open('POST', 'http://localhost:8080/msgs', true);

request.onload = function () {
    if (request.status >= 200 && request.status < 400) {
        // Success!
        data = JSON.parse(request.responseText);
        console.log(data);
    } else {
        // We reached our target server, but it returned an error
        console.log("server error");
    }
};

request.onerror = function () {
    // There was a connection error of some sort
    console.log("connection error");
};

request.send(message);

我尝试了很多其他的方法,但是我无法从服务器上得到响应。然而,当我将Go POST方法更改为GET并通过浏览器访问页面时,我得到了我非常想要的数据。我真的无法确定哪一方出错以及原因:可能是Go不应该阻止这些类型的请求,但也可能是我的javascript是非法的。

您需要其他头文件,而不仅仅是访问控制允许源文件。 如果您的请求具有“Access Control Allow Origin”头,则必须将其复制到响应头中,如果没有,则必须检查“Origin”头并将其复制到响应中。如果您的请求没有访问控制Allow Origin not Origin标头,则必须返回“*”

您可以在此处阅读完整的说明:

这是我用来写跨域头的函数:

func writeCrossDomainHeaders(w http.ResponseWriter, req *http.Request) {
    // Cross domain headers
    if acrh, ok := req.Header["Access-Control-Request-Headers"]; ok {
        w.Header().Set("Access-Control-Allow-Headers", acrh[0])
    }
    w.Header().Set("Access-Control-Allow-Credentials", "True")
    if acao, ok := req.Header["Access-Control-Allow-Origin"]; ok {
        w.Header().Set("Access-Control-Allow-Origin", acao[0])
    } else {
        if _, oko := req.Header["Origin"]; oko {
            w.Header().Set("Access-Control-Allow-Origin", req.Header["Origin"][0])
        } else {
            w.Header().Set("Access-Control-Allow-Origin", "*")
        }
    }
    w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
    w.Header().Set("Connection", "Close")

}

@Egidius,在创建XMLHttpRequest时,应该使用

var xhr = new XMLHttpRequest({mozSystem: true});
什么是mozSystem?

mozSystem Boolean:将此标志设置为true可以进行跨站点连接,而无需服务器选择使用CORS。需要设置mozAnon:true,即不能与发送Cookie或其他用户凭据结合使用。这只适用于特权(已审核)应用程序;它不适用于Firefox中加载的任意网页

对清单的更改

在您的清单上,不要忘记在您的权限中包括这一行:

"permissions": {
       "systemXHR" : {},
}

您必须将此代码放在application.rb中

config.action_dispatch.default_headers = {
        'Access-Control-Allow-Origin' => '*',
        'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}

在我看来(我写这篇文章不是为了回答,因为我不确定)您没有设置请求的内容类型。根据Mozilla的TFM主题:
如果使用POST向服务器发送数据,则通过HTTP POST请求发送到服务器的数据的内容类型为application/x-www-form-urlencoded、multipart/form data或text/plain
我很想确认您的答案;我就是不能让它工作。有什么方法可以让我看到我的Firefox OS javascript发送的头文件吗?如果我使用console.log(请求),我会得到:[object DeadObject]。Golang端打印以下w.Header():map[访问控制允许凭据:[True]访问控制允许来源:[app://d8c37181-3d41-5c40-8a1e-3abfa8cb3955]访问控制允许方法:[GET,POST]]我使用firebug。它可以让您看到整个请求和响应头和主体。现在,为什么起源说:app://?另一件事。您是否回答后端中的选项方法?所有跨域请求首先使用OPTION方法调用后端,如果该方法使用我在上一个回答中发送的头响应,则会发出真正的请求。例如:如果执行跨域POST,浏览器将向后端执行选项请求,如果回答正确(后端回答正确的cors头),则将执行真正的POST。我使用的是Gorilla/Mux,这就是我处理选项请求的方式:r:=Mux.NewRouter()r.StrictSlash(true)r.PathPrefix(“/”).Methods(“OPTIONS”).HandlerFunc(writeCrossDomainHeaders)r.Handle(“/widget”,context.Handler(blah_-blah_-blah)).Methods(“GET”)嗨,卡尔,啊,Firebug;我应该知道的。来源是app://因为我正在运行的是firefox OS应用程序。看起来这个“细节“正如@msaad所述,是造成我的问题的原因。在寻找Golang答案的过程中,我遇到过几次Gorilla,但当时我不明白为什么要使用它。但我想我应该再看一眼;您处理选项请求的方式似乎更为方便;我应该做得更好。我以前尝试过mozSystem xhr参数,但我跳过了清单部分,因为它不是有效的JSON。现在我刚刚添加了一些废话,我的错误消失了。尽管我仍然无法得到回应,但我认为这已经解决了问题,这一定是我在尝试修复CORS错误时所做的一些更改,而CORS错误现在已经把这部分搞乱了。谢谢!你太受欢迎了。COR有时可能是胡说八道,但被默认为false是好事,因为许多开发人员不了解允许这样做的风险。我很高兴能帮上忙。谢谢你提供的信息,但是你有什么来源吗?其他信息?这对我不起作用@当然可以。这可能对你有帮助。另外,确保你没有遇到CORS问题,而不是权限问题。
config.action_dispatch.default_headers = {
        'Access-Control-Allow-Origin' => '*',
        'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}