Тип метода запроса не поддерживается: ОПЦИИ в ATG - PullRequest
0 голосов
/ 07 марта 2019

У меня проблема при выполнении вызова 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

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

1 Ответ

0 голосов
/ 28 марта 2019

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

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

...