小编典典

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

java

即使我在服务响应中附加了以下提供的 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;

     });


},

阅读 293

收藏
2020-11-26

共1个答案

小编典典

我认为这里的问题是CORS中的预检请求

从Mozilla文档中,

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

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

    • application / x-www-form-urlencoded,
    • 多部分/表单数据
    • 文字/纯文字

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

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

如上所述,即使您进行的是简单的POST请求,请求中的Content-Type
application/json还是不同于上述3种类型,因此它被视为预检请求,并且在实际POST之前会触发OPTIONS请求请求。

您可以通过doOptions在servlet中实现来解决此问题,只需在其中添加标头即可使用:)

2020-11-26