即使在服务中添加Access-Control-Allow-Origin后,CORS也无法修复

问题描述:

我尝试访问Rest服务,该服务通过ajax调用托管在我的不同域中,并且在萤火虫中出现“CORS”错误。即使在服务中添加Access-Control-Allow-Origin后,CORS也无法修复

在研究了这个问题后,我发现需要通过在响应头中添加Access-Control-Allow-Origin来*来改变服务。我在服务中也这样做了。

 public Response search(String expression) { 

     return Response.ok() //200 
      .entity(ConnectionUtils.query(expression)) 
      .header("Access-Control-Allow-Origin", "*") 
      .header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT") 
      .header("Access-Control-Allow-Headers", "Content-Type,Accept") 
      .allow("OPTIONS").build(); 

    } 

上述方法实现类的以下服务接口:

 @POST 
    @Path("/search") 
    public Response search(String expression); 

我试图通过先进的铬其余客户端发布到这个URL的请求,我得到的响应为好。此外,响应标头还显示Access-Control-Allow-Origin也已正确设置。请参考下面的Chrome用户端的截图:

enter image description here

如果你看到上面的响应头已经被改变。

但我下面的Ajax调用总是返回CORS错误:

" Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://192.168.1.100:8080/cqs-1.0-SNAPSHOT/services/services/cqs/search. This can be fixed by moving the resource to the same domain or enabling CORS." 

    $.ajax({ 
     type: 'POST', 
     url: "http://192.168.1.100:8080/cqs-1.0-SNAPSHOT/services/services/cqs/search", 
     crossDomain: true, 
     dataType: 'json', 
     data: {"offer.offer.offerId.USSellerId": {$gt: 0}}, 
     headers: { 
      "Accept": "application/json", 
      contentType: "application/json" 
     }, 
     success: function (data) { 
      console.log(data); 
     }, 
     error: function (data) { 
      console.log(data.statusText); 
      console.log(data.name); 
     } 
    }); 

不要使用CORS。它充满了危险。相反,使用Apache(或类似的)在服务器上设置一个简单的反向代理。一旦设置完毕,您的应用的所有请求都可以返回到您的域/端口,因此不会从浏览器触发任何OPTION方法。同时,您的反向代理可以根据url中的路径重定向请求,这完全取决于您想要如何配置。

就我而言,我只是有一个简单的情况需要访问同一台服务器上的两个不同的端口。端口8080(tomcat)正在服务我的GWT UI,并且来自我的GWT页面(使用RestyGWT)的REST请求需要达到端口9000(Play框架端口)。由于端口不同,CORS需要处理浏览器正在执行的OPTION'预检'检查。

要解决这个问题,我只需将我的URL设置为具有/ ui路径或/ api路径。 因为域/端口是相同的,我的代理可以很容易地重定向到正确的端口(api - > 9000和ui - > 8080),因此不再需要CORS。

CORS在我的经验中有很多问题,包括cookies。使用反向代理来避免它真的更好。

如果您需要更多的细节,我可以发布更多 - 让我知道。

JR