Access-Control-Allow-Origin не работает в приложении AngularJS

Я пытаюсь использовать свой (совместимый с CORS) сервис RESTful

@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 не может загрузить http://localhost:8080/NobelGrid/api/users/greeting. . Ответ на предварительный запрос не проходит проверку управления доступом: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». Таким образом, доступ к источнику 'http://localhost:63342' запрещен.

Используя консольную сеть Chrome, это кажется правдой, потому что заголовок ответа:

введите здесь описание изображения

В любом случае, доступ к службе REST из браузера, а не из приложения Angular, заголовок правильный

введите здесь описание изображения

Я также пробовал этот учебник:

https://spring.io/guides/gs/using-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();
}

оно работает. В начале выдает мне другую ошибку:

Поле заголовка запроса Авторизация не разрешена Access-Control-Allow-Headers в предварительной проверке [..]

но добавление Authorization к Access-Control-Allow-Headers GET и POST решает проблему.


person Pietro Fragnito    schedule 04.02.2016    source источник


Ответы (1)


Посмотрите на сообщение об ошибке:

Ответ на предварительный запрос

Посмотрите сетевой журнал:

Метод запроса: ВАРИАНТЫ

Посмотрите на свой API:

@ПОЛУЧАТЬ

Вам нужно написать обработчик для предварительного запроса OPTIONS. до того, как браузер сделает запрос GET к написанному вами обработчику.

person Quentin    schedule 04.02.2016
comment
Привет @Квентин! Я плохо понял (извините): мне нужно написать обработчик для OPTIONS на стороне сервера? Или я должен сделать некоторые вещи на стороне клиента? Большое спасибо - person Pietro Fragnito; 08.02.2016
comment
Вы должны написать обработчик для OPTIONS на своем сервере (или изменить запрос, чтобы он не нуждался в предполетной проверке (особенности которой описаны на другом конце ссылки в ответе)). - person Quentin; 08.02.2016
comment
Спасибо #Квентин! Пожалуйста, вы видите мое ОБНОВЛЕНИЕ? - person Pietro Fragnito; 08.02.2016