即使存在所有CORS标头,也会出现跨源资源共享问题

即使我已经通过以下提供的CORS标头添加了我的服务响应:

resp.setContentType("application/json"); resp.addHeader("Access-Control-Allow-Origin", "*"); resp.addHeader("Access-Control-Allow-Credentials", "true"); resp.addHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS"); resp.addHeader("Access-Control-Allow-Headers", "Origin,accept,content-type"); resp.flushBuffer(); 

在尝试通过我的AngularJS前端访问服务中的一些POST Web方法时,我仍然在控制台中出现以下错误。

 XMLHttpRequest cannot load http://192.***.*.***:8080/abc/def/search/vehicleManufacturer. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.***.*.***:8085' is therefore not allowed access. 

但是在同一个类中,一些没有任何有效负载的POST方法完全响应。 有什么建议 ?

编辑———>

下面是我用于调用web方法的AngularJS客户端屏幕代码: –

 getVehicleModel : function(searchData,$scope){ $http({ method:'POST', url:'http://192.169.*.***:8085/abc/def/search/vehicleModel', dataType:'jsonp', data:searchData }). success(function(data){ console.log("vehicle model") $scope.vehicleModel = data.Response; }); }, 

我认为这里的问题是CORS中的Preflighted Requests 。

来自Mozilla文档,

与简单请求(如上所述)不同,“预检”请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以便确定实际请求是否可安全发送。 跨站点请求是这样预检的,因为它们可能对用户数据有影响。 特别是,如果出现以下情况,请求会被预检:

  • 它使用GET,HEAD或POST以外的方法。 此外,如果POST用于发送除Content-Type以外的Content-Type的请求数据

    • 应用程序/ x-WWW窗体-urlencoded,
    • 多部分/格式数据
    • 纯文本/

    例如,如果POST请求使用application / xml或text / xml将XML有效负载发送到服务器,则该请求将被预检。

  • 它在请求中设置自定义标头(例如,请求使用诸如X-PINGOTHER之类的标头)

如上所述,即使你正在做一个简单的POST请求,你的请求中的Content-Type是application/json ,它与上面提到的3种类型不同,所以它被认为是一个Preflight请求,并且之前触发了一个OPTIONS请求你的实际POST请求。

你可以通过在你的servlet中实现doOptions来解决这个问题,只需在那里添加标题就可以了:)

由于您正在发送跨源ajax请求并使用此GET请求指定Authorization标头,因此正在进行预检(OPTIONS)。

另外(这不会导致问题)我建议删除contentType选项。 这在GET请求的上下文中没有意义。 GET请求不应包含任何内容。 所有数据都应包含在查询字符串中,或​​者可能包含在标题中。

授权标头不会与OPTIONS一起发送。 您必须在服务器端确认它,然后浏览器将发送基础GET。 有关CORS的更多信息, 请访问https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS 。