工作我想我的消費(CORS兼容)RESTful服務訪問控制允許來源不是AngularJS應用
@Path("/greeting")
@GET
@Produces("application/json")
public Response greeting() {
String result = "{\"id\":1,\"content\":\"Hello, World!\"}";
return Response.ok() //200
.entity(result)
.header("Access-Control-Allow-Origin", "*")
.build();
}
從我AngularJS應用
。
function ($scope, $http) {
$scope.dashboard = "ESCO Dashboard";
console.log('start');
// Simple GET request example:
$http({
method: 'GET',
url: 'http://localhost:8080/NobelGrid/api/users/greeting'
}).then(function successCallback(response) {
console.log('success');
$scope.greeting = response.data;
}, function errorCallback(response) {
console.log('error');
});
console.log('end');
}
但我有此錯誤:
XMLHttpRequest cannot load http://localhost:8080/NobelGrid/api/users/greeting . Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' http://localhost:63342 ' is therefore not allowed access.
使用Chrome的控制檯網絡,這似乎引起響應頭真的是:
反正訪問的REST服務從瀏覽器而不是從Angular應用程序,標頭是正確的
我也試過這個教程:
https://spring.io/guides/gs/consuming-rest-angularjs/
與他們的RESTful服務(也CORS兼容,他們說),但結果是一樣的。
ps:我正在使用WebStorm作爲IDE。
更新 - 解決
在服務器端寫這個處理程序:
@Path("/greeting")
@OPTIONS
@Produces("application/json")
public Response greetingOPT() {
return Response.status(200) //200
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS")
.header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Codingpedia,Authorization")
.build();
}
它的工作原理。在開始的時候它給我一個錯誤:
Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight [..]
但加入Authorization
到GET的Access-Control-Allow-Headers
和POST解決問題。
嗨@Quentin!我不明白(對不起):我必須在服務器端編寫一個OPTIONS處理程序?或者我必須在客戶端做一些事情?非常感謝 –
您必須在您的服務器上爲OPTIONS編寫一個處理程序(或更改請求,以便它不需要預檢檢查(具體細節在回答中鏈接的另一端進行了描述))。 – Quentin
謝謝#Quentin!請你能看到我的更新? –