Как обработать ошибку CORS с приложением angular и бэкэндом java? - PullRequest
0 голосов
/ 14 января 2020

У меня есть angular приложение, которое пытается отправить ajax запросы в java бэкэнд (API, построенный на Джерси).

Вот запрос клиента:

let settings = {
      "url": "http://localhost:8080/simulator/config",
      "method": "POST",
      "timeout": 0,
      "headers": {
        "Content-Type": "application/json"
      },
      "data": JSON.stringify({
        "fromDate": fromDate,
        "tsIntervalTag": tsIntervalTag,
        "tsIntervalDevice": tsIntervalDevice,
        "devicePerMinute": devicePerMinute,
        "tagPerMinute": tagPerMinute,
        "quantityOfTags": quantityOfTags,
        "quantityOfDevices": quantityOfDevices
      }),
    };

    $.ajax(settings).done(function (response) {
      console.log(response);
    });

А вот обработчик запросов java:

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response postIt(String body) {
        try {
            //do stuff
            return Response.ok(body, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*").build();
        } catch (Exception e) {
            return Response.serverError().entity(e).header("Access-Control-Allow-Origin", "*").build();
        }
    }

Как видите, поскольку почти все ответы о состоянии CORS, заголовок Access-Control-Allow-Origin установлен в * подстановочный знак, поэтому, насколько я понимаю, ответ должен вернуться в браузер.

Но консоль браузера возвращает следующее:

Запрос перекрестного происхождения заблокирован: тот же источник Политика запрещает чтение удаленного ресурса по адресу http://localhost: 8080 / simulator / config . (Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»).

Запрос перекрестного источника заблокирован: та же политика происхождения запрещает чтение удаленного ресурса в http://localhost: 8080 / simulator / конфигурации . (Причина: запрос CORS не был выполнен).

Так что я пропустил?

1 Ответ

0 голосов
/ 14 января 2020

Кажется, что с Джерси, лучше использовать фильтры для установки CORS. (По крайней мере, в моем сценарии, где все запросы должны приниматься откуда угодно (пока)).

Поэтому я создал следующий класс (в своем собственном java файле):

package com.example;

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
            throws IOException {
        System.out.println("FILTER HERE ");
        MultivaluedMap<String, Object> headers = responseContext.getHeaders();
        headers.add("Access-Control-Allow-Origin", "*"); // Allow Access from everywhere
        headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
        headers.add("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
    }

}

И это в основном все. Все запросы пройдут через go и получат правильные заголовки. Я не знаю, почему установка заголовков в методе напрямую не сработала.

...