【发布时间】:2018-06-28 12:46:43
【问题描述】:
每次我们尝试通过 AJAX JQuery 访问我的 REST Web 服务时,都会被 Cross-Origin 阻止:
跨域请求被阻止:同源策略不允许读取 http://***** 上的远程资源 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。
我们在 Glassfish 3.1.2 上使用 Java REST Web 服务,客户端使用 Firefox Quantum 57。
请看下面的代码:
$.ajax({
type: 'POST',
url: webservice + "/webresources/ivi/syncPassphrase",
crossOrigin: true,
data :JSON.stringify({
'passPhrase' : passphrase
}),
dataType: 'json',
async: false,
contentType: 'application/json; charset=utf-8',
crossDomain: true,
success: function(data){
syncData = data["output"];
}, error: function(){
}
});
我们已经阅读了关于 SO 的几个答案,并尝试过如下方式:
$.ajax({
type: 'POST',
url: webservice + "/webresources/ivi/syncPassphrase",
crossOrigin: true,
data :JSON.stringify({
'passPhrase' : passphrase
}),
xhrFields: {
withCredentials: true
},
dataType: 'json',
async: true,
contentType: 'application/json; charset=utf-8',
crossDomain: true,
timeout: 20000,
beforeSend: function(xhr){
xhr.setRequestHeader("Access-Control-Allow-Origin",'http://111.111.111.111:8080');
},
success: function(data){
syncData = data["output"];
console.log("xxx1 " + syncData);
}, error: function(xhr, status, error) {
console.log("xxx2 " + xhr.responseText + " | " + status + " | " + error + " | ");
}
});
但上面的代码仍然会产生同样的错误。
在服务器端,我们设置了允许跨源每个请求并响应如下代码:
@Override
public void filter(final ContainerRequestContext requestContext,
final ContainerResponseContext cres) throws IOException {
cres.getHeaders().add("Access-Control-Allow-Origin", "*");
cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
cres.getHeaders().add("Access-Control-Max-Age", "1209600");
}
我没有主意了。有什么想法吗?
谢谢
【问题讨论】:
-
双重检查:(1) 过滤器实际被应用(通过调试它),(2) 标题没有被另一个过滤器覆盖(通过调试所有过滤器),(3 ) 当负载均衡器(如果使用)重写响应时,响应标头不会丢失