2016-10-19 7 views
0

Сервер 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: *» всегда присутствует.

+0

Тестирование с помощью хрома? - http://stackoverflow.com/a/10892392/775715 –

+0

@JoakimErdfelt нет, не только. Браузеры - это Safari, Chrome и Firefox. – JCvanDamme

ответ

0

Вместо использования метода restangular's post() мне пришлось использовать метод customPOST().

 Смежные вопросы

  • Нет связанных вопросов^_^