Получение проблемы CORS при подключении к Java FN из Angular UI - PullRequest
0 голосов
/ 28 марта 2019

В настоящее время я пытаюсь решить проблему с CORS, которая возникает у нас при запросе к базе данных с помощью функции проекта FN, которая вызывается из Angular. Функция FN написана на Java (fnproject/fn-java-fdk:1.0.83), а пользовательский интерфейс - на Angular 7. По сути, мы отправляем запрос JSON в функцию FN в виде байтового массива, который обрабатывает запрос JSON в соответствующий запрос, а затем отправляет это в базу данных. База данных отвечает результатом запроса, который через функцию FN возвращается к пользовательскому интерфейсу с соответствующим ответом.

Я попытался поместить заголовки CORS как htxc.setResponseHeader () и htxc.addResponseHeader (). Я также попытался изменить func.yaml для включения в него протоколов CORS, а не внутри функции, но это не работает. Кроме того, я попытался изменить "*" в заголовке Access-Control-Allow-Origin на конкретный URL-адрес, с которого мы также выполняли запрос. Мы также рассмотрели добавление множества различных заголовков к Access-Control-Allow-Headers в надежде, что один из них решит проблему.


import com.fnproject.fn.api.httpgateway.HTTPGatewayContext;
...

public class query_database {

    /**
     * @param input is a byte[] array with input, contains the request information
     * @return List<dbObject> A list of DB Objects
     */
    public List<dbObject> query(byte[] input, HTTPGatewayContext htxc){


        // Takes care of the HTTP Gateway context
        htxc.setResponseHeader("Access-Control-Allow-Origin", "*");
        htxc.addResponseHeader("Access-Control-Allow-Methods", "POST, GET");
        htxc.addResponseHeader("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type, Accept, Content-Length, X-Experience-API-Version, X-Prototype-Version, Token, X-Auth-Token");
        htxc.addResponseHeader("Access-Control-Allow-Credentials", "true");

        if (htxc.getMethod().equals("OPTIONS")) {
            return Collections.emptyList();
        }

        String str = new String(input);
        JSONObject json = new JSONObject(str);;

        Request request = new Request();
        String system = json.getString("system");
        request.setSystem(system);

        queryFunc queryFunc = new queryFunc();

        try {

            return queryFunc.makeQuery(request);

        } catch(DBConnection | HttpException |IOException | emptyStringException e) {

            return Collections.emptyList();

        }
    }
}

В пользовательском интерфейсе Angular 7, когда мы открываем его в Chrome / Firefox, появляется следующая ошибка:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://server.com:8080/t/function/function-trigger. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).  (unknown)

Это несмотря на то, что заголовок ответа «Access-Control-Allow-Origin» установлен в коде Java. Функция работает правильно, кроме этой ошибки CORS, поэтому мы достаточно уверены, что это что-то с заголовками. Например, ответ JSON правильный.

Есть мысли? Потенциально может быть что-то не так с текущим подходом заголовка, или, возможно, это может быть и на угловой стороне. Дайте мне знать, если есть необходимость в разъяснении этого вопроса.

...