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

时间:2014-09-18 20:35:16

标签: ajax rest cors

我尝试通过ajax调用访问一个在我的不同域中托管的Rest服务,然后我得到了#34; 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);

我尝试通过chrome高级休息客户端向此网址发布请求,我也收到了回复。响应头也显示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);
        }
    });

1 个答案:

答案 0 :(得分:1)

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

就我而言,我只是需要在同一台服务器上访问2个不同的端口。端口8080(tomcat)正在为我的GWT UI提供服务,来自我的GWT页面的REST请求(使用RestyGWT)需要命中端口9000(Play框架端口)。由于端口不同,CORS需要处理OPTION' preflight'检查浏览器是否正在运行。

要解决这个问题,我只需将我的网址设置为/ ui路径或/ api路径。 由于域/端口是相同的,并且我的代理可以轻松地透明地重定向到正确的端口(api - > 9000和ui - > 8080),因此不再需要CORS。

CORS在我的经验中遇到很多问题,包括cookies。使用反向代理避免使用反向代理确实更好。

如果您需要更多详细信息,我可以发布更多信息 - 请告诉我。

JR