【问题标题】:CORS could not get fixed even after adding Access-Control-Allow-Origin in service即使在服务中添加 Access-Control-Allow-Origin 后,CORS 也无法修复
【发布时间】:2014-11-13 08:04:18
【问题描述】:

我尝试通过 ajax 调用访问托管在与我不同域中的 Rest 服务,但在 firebug 中出现“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 高级休息客户端向该 url 发布请求,我也收到了响应。响应标头还显示 Access-Control-Allow-Origin 也已正确设置。请参考下面的chrome客户端截图:

如您所见,响应标头已更改。

但我下面的 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);
    }
});

【问题讨论】:

    标签: ajax rest cors


    【解决方案1】:

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

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

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

    在我的经验中,CORS 存在很多问题,包括 cookie。最好使用反向代理来避免它。

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

    JR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-20
      • 2020-09-19
      • 1970-01-01
      • 2016-09-30
      • 2023-01-15
      • 2016-06-10
      • 2020-03-31
      • 2017-10-29
      相关资源
      最近更新 更多