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

时间:2015-04-13 08:35:02

标签: java angularjs rest 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 方法完全响应。有什么建议吗?

EDIT --------->

以下是用于调用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;

     });


},

2 个答案:

答案 0 :(得分:4)

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

来自Mozilla文档,

  

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

     
      
  • 它使用GET,HEAD或POST以外的方法。此外,如果使用POST来发送内容类型不是

    的请求数据      
        
    • 应用程序/ x-WWW窗体-urlencoded,
    •   
    • multipart / form-data
    •   
    • 文本/纯
    •   
         

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

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

  •   

如上所述,即使您正在发出一个简单的POST请求,您的请求中的内容类型也是application/json,这与上面提到的3种类型不同,因此它被视为预检请求和OPTIONS请求在您的实际POST请求之前被触发。

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

答案 1 :(得分:1)

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

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

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