Сервер Grizzly работает на локальном хосте: 8080, который использует Джерси, чтобы предложить интерфейс REST.Заголовки CORS, созданные Grizzly, не всегда распознаются клиентом
Класс CorsFilter отвечает за создание заголовков CORS. Он добавляется в ресурс конфигурации в GrizzlyServer:
final ResourceConfig rc = new ResourceConfig()
.packages("my.application.api.rest")
.register(new CorsFilter());
GrizzlyHttpServerFactory.createHttpServer(uri, rc); // uri defined earlier
Вот класс CorsFilter как найти в другом посте:
@Provider
public class CorsFilter implements ContainerResponseFilter {
private final String HEADERS = "Origin, Content-Type, Accept";
@Override
public void filter(ContainerRequestContext request, ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin", "*");
response.getHeaders().add("Access-Control-Allow-Headers", HEADERS);
response.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
}
Есть два класса, представляющие обработчики REST: my.application.api .rest.A.class my.application.api.rest.B.class
Оба ресурса а и в имеют обработчик POST:
@Path("/A")
public class A {
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response handlePost()
{
Object payload = getPayload();
return Response.ok(payload).build();
}
}
B похож на А.
Клиент является AngularJS на основе веб-приложение, размещенное на локальном сервере узла с локального хоста: 3000. Посты в/A и/B выполнены с использованием Restangular:
Restangular.all('A').post({
key: value
});
В то время как POST к А выполняется всеми доступными браузеров (Chrome, Safari, Firefox), то же ПОСТ к В не выполняется по следующим причинам ошибка:
XMLHttpRequest cannot load http://localhost:8080/myapplication/B. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 500.
Я предполагаю, что заголовки, добавленные CorsFilter, где-то теряются.
POST с Postman для A и B хорошо работают и заголовок «Access-Control-Allow-Origin: *» всегда присутствует.
Тестирование с помощью хрома? - http://stackoverflow.com/a/10892392/775715 –
@JoakimErdfelt нет, не только. Браузеры - это Safari, Chrome и Firefox. – JCvanDamme