我尝试通过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客户端屏幕截图:
如果您看到上述内容,则响应标头已更改。
但是我的下面的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);
}
});
答案 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