Access-Control-Allow-Origin ATG REST API

Я создаю портал с помощью angularjs и ATG REST API, это дает ошибку, когда я пытаюсь получить номер подтверждения сеанса с помощью API:rest/model/atg/rest / SessionConfirmationActor / getSessionConfirmationNumber

Ошибка: XMLHttpRequest не удается загрузить http://IPNUMBER:Port/rest/model/atg/rest/SessionConfirmationActor/getSessionConfirmationNumber . Заголовок «Access-Control-Allow-Origin» отсутствует на запрошенном ресурсе. Origin ‘http://localhost» поэтому доступ запрещен.

API отлично работает как в POSTMAN, так и из прямого браузерного запроса.
Пожалуйста, помогите мне в этом.

2 ответа

  1. Я не использовал этот API, но проблема довольно распространена. Посмотрите, например, здесь (или любой другой источник о CORS):

    Как работает заголовок Access-Control-Allow-Origin?

    Если веб-приложение и служба имеют разные домены (источники), это не будет работать до тех пор, пока служба не разрешит приложению запрашивать данные. При использовании Postman это работает, потому что Postman не отправляет заголовок или использует origin, что разрешено. Я действительно не знаю, как это работает, но это так, и это нормально.

    Если вы используете локально размещенное приложение только для целей тестирования, а сервис и приложение будут иметь один и тот же источник, у вас есть два простых решения:

    1. Вы можете запустить веб-браузер (например, Chrome) с отключенной веб-безопасностью:
      Отключить ту же политику происхождения в Chrome . Это отключает CORS и устраняет проблему.
    2. Вы можете установить расширение Chrome под названием Allow-Control-Allow-Origin: * . Когда он включен, он отправляет источник, который будет разрешен службой.

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


    Редактировать

    Обратите внимание на одну вещь. Если вы отправляете запрос, отличный от GET или с некоторыми пользовательскими заголовками, браузеры сначала отправят запрос опций. Это называется preflight request. You’re service will have to handle it in order to work properly.

  2. Лучше всего написать простой конвейерный сервлет и добавить его в конфигурацию RestPipeline. Сервлет просто вставит заголовки cors во все запросы Rest.

    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import atg.servlet.*;
    import atg.servlet.pipeline.*;
    
    public class CORSHeaderServlet extends InsertableServletImpl{
      public CORSHeaderServlet () {}
      public void service (DynamoHttpServletRequest request,
                           DynamoHttpServletResponse response)
           throws IOException, ServletException
      {
         //add headers to response.
        response.addHeader("Access-Control-Allow-Origin" ,"*");
        passRequest (request, response);
      }
    }