【发布时间】: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);
}
});
【问题讨论】: