AJAX CORS请求源被阻止 - Java Web服务

时间:2018-01-19 09:56:09

标签: java jquery ajax cors

我们尝试通过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 + " | ");
    }
});

但上面的代码仍会产生相同的错误。

在服务器端,我们为每个请求设置allow cross origin,并像下面的代码一样响应:

@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 个答案:

答案 0 :(得分:0)

有几件事:

  1. 您无需在请求中发送ACAO标头 - 此客户端代码无效:

    beforeSend: function(xhr){
        xhr.setRequestHeader("Access-Control-Allow-Origin",'http://111.111.111.111:8080');
    },
    
  2. Access-Control-Allow-Origin *(ACAO)响应标头与Access-Control-Allow-Credentials: true(ACAC)标头不兼容。如果您需要Cookie或身份验证,则必须指定Access-Control-Allow-Origin: {value-of-Origin-request-header}

  3. 第二个可以解决它。

    <强>更新

    您的服务器代码应如下所示:

    @Override
    public void filter(final ContainerRequestContext requestContext,
                  final ContainerResponseContext cres) throws IOException {
      cres.getHeaders().add("Access-Control-Allow-Origin", "http://your-origin:port");
      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");
    }
    

    但将http://your-origin:port替换为发出请求的网页域名(包括端口,如果它不是80)。我不知道你的服务器代码,但如果你可以检索Origin请求头的值,而不是硬编码,那就更好了。

    这更有意义吗?