跨源请求被阻止

时间:2014-03-12 20:38:11

标签: ajax google-app-engine go cors firefox-os

所以我得到了这个Go http处理程序,它将一些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);

传入的部分都是如此。但是,我的回复被阻止了。给我以下信息:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/msgs. This can be fixed by moving the resource to the same domain or enabling CORS.

我尝试了很多其他的东西,但我无法从服务器获得响应。但是,当我将Go POST方法更改为GET并通过浏览器访问页面时,我得到了我想要的数据。我无法确定哪一方出错了,为什么:Go可能不会阻止这类请求,但也可能是我的javascript非法。

4 个答案:

答案 0 :(得分:19)

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

var xhr = new XMLHttpRequest({mozSystem: true});

什么是mozSystem?

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

您的清单的更改

在您的清单上,不要忘记在您的权限中包含此行:

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

答案 1 :(得分:9)

ERROR : Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at the url. This can be fixed by moving the resource to the same domain or enabling CORS.

解决方案:

我找到了解决方案cross-origin request bolcked "solved"

如果您正在处理Web项目并希望从不同的站点获取数据, 有时你会遇到这种类型的错误 然后你必须在服务服务器(不是接收服务器)的根文件夹中使用 htaccess 文件

更新代码

<FilesMatch "\.(php)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>  

如果您是wordpress开发人员,请更新以下代码:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

<FilesMatch "\.(php)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

# END WordPress 

谢谢:)快乐编码:

答案 2 :(得分:3)

跨域请求被阻止

您必须将此代码放入application.rb

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

答案 3 :(得分:2)

您需要其他标头,而不仅仅是access-control-allow-origin。 如果您的请求具有“Access-Control-Allow-Origin”标头,则必须将其复制到响应标头中。如果不是,则必须检查“Origin”标头并将其复制到响应中。如果您的请求没有Access-Control-Allow-Origin而不是Origin标头,则必须返回“*”。

您可以在此处阅读完整说明:http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server

这是我用来编写跨域标题的函数:

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")

}