Включение CORS в веб-сервисе Java - PullRequest
0 голосов
/ 17 января 2019

ПРИМЕЧАНИЕ: я уже разобрался с решением. Я просто публикую сообщение о проблеме и решении на тот случай, если у других возникнет аналогичная проблема

Короче говоря:

Я получаю это сообщение об ошибке CORS в окне инструментов разработчика моего браузера, когда у меня клиентское приложение REACT делает HTTP-сообщение на веб-сервере Java, запущенном на сервере Payara из NetBeans:

SEC7120: [CORS] Источник 'http://localhost:3000' не найден 'http://localhost:3000' в ответе Access-Control-Allow-Origin заголовок для перекрестного источника ресурса в «http://localhost:8080/DatabaseWebService/databaseConnectorMethod'.

Для получения дополнительной информации о CORS, пожалуйста, обращайтесь на этот сайт https://enable -cors.org /

Подробная история:

У меня есть проект REACT, работающий на http://localhost:3000, который отправляет HTTP-сообщение в имеющуюся у меня веб-службу Java (DatabaseWebService), работающую на локальном сервере Payara версии 4.1.1. URL веб-службы, который запрашивает приложение REACT: 'http://localhost:8080/DatabaseWebService/databaseConnectorMethod'

Каждый раз, когда я запускаю код REACT, я получаю ошибку CORS, указанную выше.

Вот мой РЕАКТ-код, отправляющий запрос http:

            const postData = new URLSearchParams();
            postData.append('var1', 'somedata1');
            postData.append('var2', 'somedata2');
            let axiosConfig = {
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'                
}
            };

        axios.post('http://localhost:8080/DatabaseWebService/databaseConnectorMethod', postData, axiosConfig)
            .then((res) => {
                console.log("AXIOS POST RESPONSE RECEIVED: ", res);
            })
            .catch((err) => {
                console.log("AXIOS POST ERROR: ", err);
            })

Вот мой код сервлета:

public class DatabaseConnectorServlet extends HttpServlet {
        @Override
        final protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
                throws ServletException, IOException {

            try {
                System.out.println("DatabaseConnectorServlet Received a HTTP POST");  

                String var1= request.getParameter("var1");
                String var2= request.getParameter("var2");
                System.out.println(var1 + var2);
                response.getWriter().print("I GOT YOUR MESSAGE");
            } catch (Exception ex) {                          
                response.getWriter().print(ex);
            }
        }

Я поставил точки останова в коде Java выше и вижу, что он получает удар, и я вижу, что он выполняет все команды, включая response.getWriter (). Print, без проблем. Однако, когда я смотрю в окно консоли инструментов разработчика браузеров, я вижу исключение CORS.

1 Ответ

0 голосов
/ 17 января 2019

РЕШЕНИЕ В приложении веб-службы Java вам необходимо добавить некоторые заголовки, чтобы разрешить CORS в объекте Response. Вот обновленный код Java, обратите внимание на дополнительную строку кода response.addHeader:

public class DatabaseConnectorServlet extends HttpServlet {

    @Override
    final protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
            throws ServletException, IOException {

        try {
            System.out.println("DatabaseConnectorServlet Received a HTTP POST");
            response.addHeader("Access-Control-Allow-Origin", "http://localhost:3000"); //Here's the extra line needed to allow CORS to your server side code

            String var1 = request.getParameter("var1");
            String var2 = request.getParameter("var2");
            System.out.println(var1 + var2);
            response.getWriter().print("I GOT YOUR MESSAGE");

        } catch (Exception ex) {
                response.addHeader("Access-Control-Allow-Origin", "http://localhost:3000");
            response.getWriter().print(ex);
        }
    }

С этим обновленным кодом я теперь вижу пример текста «Я ПОЛУЧИЛ ВАШЕ СООБЩЕНИЕ» в окне консоли инструмента разработчика веб-браузера, где выполняется код React.

Это в основном позволяет http-запросу из другого домена / порта (т.е. в данном случае приложения REACT) получить доступ к данным из этого веб-сервиса Java.

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

 response.addHeader("Access-Control-Allow-Origin", "http://localhost:3000");
        response.addHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, X-Auth-Token");
        response.addHeader("Access-Control-Allow-Credentials", "true");
        response.addHeader("Access-Control-Request-Headers", "Origin, X-Custom-Header, X-Requested-With, Authorization, Content-Type, Accept");
        response.addHeader("Access-Control-Expose-Headers", "Content-Length, X-Kuma-Revision");
        response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, PATCH, OPTIONS");
...