2016-02-09 375 views
5

我在Java中制作了一个非常简单的JSON API。它实际上是一个Project Zomboid mod,它服务于对象坐标。这是我的HTTP处理程序看起来像:CORS头'Access-Control-Allow-Origin'不匹配...但它确实!

public class JSONZomboid implements HttpHandler 
{ 
    @Override 
    public void handle(HttpExchange t) throws IOException { 
     // HEADERS 
     Headers headers = t.getResponseHeaders(); 
     headers.set("Content-Type", "text/json"); 
     headers.set("Access-Control-Allow-Origin", "pzmap.crash-override.net");     
     t.sendResponseHeaders(200,0); 
     //BODY 
     OutputStream os = t.getResponseBody(); 
     os.write("{\n".getBytes()); 
      // generate JSON here 
     os.write("}".getBytes()); 
     os.close(); 
    } 
} 

我想这个加载到使用userscript这意味着我需要启用CORS连接创建Widget地图项目。这是通过简单的代码来完成:

PlayerRenderer.prototype.fetchInfo = function() { 
    $.get("http://127.0.0.1:8000/test", {}, this.displayPoints.bind(this)); 
} 

但我得到这个错误:

warning http://images.michaelsync.net/images/2007/09/warningicon.png Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://127.0.0.1:8000/test . (Reason: CORS header 'Access-Control-Allow-Origin' does not match 'pzmap.crash-override.net').

即使在控制台我可以清楚地看到错误的误导性:

image description

如果我没有讨厌CORS,现在我开始讨厌它了。你能告诉我属于允许源头的实际字符串是什么?

+2

标题应具有允许访问内容的站点的主机名。如果你正从'pzmap.crash-override.net'托管的网站加载你的页面,那么它应该可以工作。错误是告诉你标题包含什么,而不是源域是什么。 – Pointy

+1

您可以在请求标题('Origin'和'Referer')中看到我要加载哪个站点。 –

+0

实际上很难在小屏幕上看到这些图像的细节:/ – Pointy

回答

1

上面的注释#1是正确的:CORS需要Access-Control-Allow-Origin头匹配客户端的原始请求(用于端到端SSL体验)。因此,在这种情况下,请确保在您的Access-Control-Allow-Origin标头中设置pzmap.crash-override.net。

有两点需要注意:

1 - 尽管你可以在线阅读,目前Nginx的要求被列为单独的行多个条目,一拉: add_header访问控制允许来源“https://developers.google.com”; add_header访问控制允许来源“https://imasdk.googleapis.com”;

2 - 同样,尽管您可能在线阅读,但通配符的使用并不正确。并非所有的客户端(即浏览器)都允许它。

相关问题