即使我在服务响应中附加了以下提供的 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 方法都可以完美地响应。有什么建议 ?
编辑--------->
下面是我的AngularJS客户端屏幕代码,用于调用Web方法:-
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中的预检请求。
从Mozilla文档中,
与简单请求(如上所述)不同,“预检”请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可以安全发送。跨站点请求这样被预检,因为它们可能会影响用户数据。特别是在以下情况下,请求将被预检: 它使用GET,HEAD或POST以外的方法。另外,如果使用POST发送的Content-Type以外的请求数据 application / x-www-form-urlencoded, 多部分/表单数据 文字/纯文字 例如,如果POST请求使用application / xml或text / xml将XML有效负载发送到服务器,则该请求被预检。 它在请求中设置自定义标头(例如,请求使用标头,例如X-PINGOTHER)
与简单请求(如上所述)不同,“预检”请求首先通过OPTIONS方法向另一个域上的资源发送HTTP请求,以确定实际请求是否可以安全发送。跨站点请求这样被预检,因为它们可能会影响用户数据。特别是在以下情况下,请求将被预检:
它使用GET,HEAD或POST以外的方法。另外,如果使用POST发送的Content-Type以外的请求数据
例如,如果POST请求使用application / xml或text / xml将XML有效负载发送到服务器,则该请求被预检。
如上所述,即使您进行的是简单的POST请求,请求中的Content-Type application/json还是不同于上述3种类型,因此它被视为预检请求,并且在实际POST之前会触发OPTIONS请求请求。
application/json
您可以通过doOptions在servlet中实现来解决此问题,只需在其中添加标头即可使用:)
doOptions