Тип метода запроса не поддерживается: OPTIONS в ATG

У меня возникла проблема при выполнении вызова API с методом запроса POST. Метод предварительной проверки OPTIONS не работает. Я использую ATG на weblogic 12c. Ниже приведен мой код CORS.

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" ,"*");
    response.addHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS");
    response.addHeader("Access-Control-Allow-Headers","Origin, Content-Type, X-Auth-Token, X-PINGOTHER");
    response.addHeader("Access-Control-Max-Age", "86000");
    passRequest (request, response);
  }
}

Ошибка браузера

 Access to XMLHttpRequest at 'http://localhost:7003/rest/model/atg/userprofiling/ProfileActor/login' from origin 'http://localhost' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status

Ошибка Java

 ]] Root cause of ServletException.
javax.servlet.ServletException: The request method type is not supported: OPTIONS
        at atg.rest.servlet.RestPipelineServlet.serviceRESTRequest(RestPipelineServlet.java:493)
        at atg.rest.servlet.RestPipelineServlet.service(RestPipelineServlet.java:274)
        at atg.servlet.pipeline.PipelineableServletImpl.passRequest(PipelineableServletImpl.java:157)
        at atg.servlet.pipeline.PipelineableServletImpl.service(PipelineableServletImpl.java:320)
        at atg.rest.servlet.RestPipelineServlet.service(RestPipelineServlet.java:278)
        Truncated. see log file for complete stacktrace

Любая помощь по этому вопросу будет принята с благодарностью.


person Vasuki Vardhan    schedule 07.03.2019    source источник
comment
Возможный обман stackoverflow.com/questions/7067966/how-to-allow-cors   -  person bated    schedule 07.03.2019
comment
Нет, этот конкретный поток касается CORS в NodeJS, мой вопрос очень специфичен для Oracle ATG.   -  person Vasuki Vardhan    schedule 07.03.2019
comment
Ваша проблема такая же   -  person bated    schedule 07.03.2019
comment
Да, проблема та же, но ни одно из этих решений не работает для меня, поэтому я решил опубликовать вопрос в надежде получить конкретное решение ATG.   -  person Vasuki Vardhan    schedule 07.03.2019


Ответы (1)


Предполагается, что RestPipelineServlet передает запрос правильному RestProcessor. Глядя на интерфейс RestProcessor, кажется, что он реализует только подмножество METHODS, которое вы хотите использовать (doc). Поэтому для вашего решения вам, вероятно, придется реализовать метод doRESTOptions в ActorProcessor и работать оттуда.

Внедрить это в приложение будет непросто. Также может быть доступна METHOD проверка реализованных методов в RestPipelineServlet, которую вам необходимо изучить и переопределить/расширить.

person radimpe    schedule 28.03.2019