即使我已经通过以下提供的 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;
});
},
答案 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的更多信息。