2016-10-19 8 views
0

Grizzly 서버는 Jersey를 사용하여 REST 인터페이스를 제공하는 localhost : 8080에서 실행됩니다.Grizzly에서 작성한 CORS 헤더는 클라이언트가 항상 인식하지 못함

CorsFilter 클래스는 CORS 헤더를 생성합니다. 그것은이 GrizzlyServer의 리소스 설정에 추가됩니다

@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 여기

final ResourceConfig rc = new ResourceConfig() 
          .packages("my.application.api.rest") 
          .register(new CorsFilter()); 
GrizzlyHttpServerFactory.createHttpServer(uri, rc); // uri defined earlier 

다른 게시물에 발견으로 CorsFilter 클래스입니다

: .rest.A.class my.application.api.rest.B.class

모두 자원 A와 B는 POST 핸들러가

b는 다음과 유사합니다.

클라이언트는 localhost : 3000의 로컬 노드 서버에서 호스팅되는 AngularJS 기반 웹 응용 프로그램입니다./A 및/B에 게시물 Restangular를 사용하여 수행됩니다 A와 POST가 사용할 수있는 모든 브라우저 (크롬, 사파리, 파이어 폭스)에 의해 실행되는 동안

Restangular.all('A').post({ 
    key: value 
}); 

, B에 동일한 POST는 다음으로 인해 실행되지 않습니다 오류 :

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에 의해 추가 된 헤더가 어딘가에서 손실되었다고 가정합니다.

A와 B에 우편 배달부가있는 POST가 제대로 작동하고 "Access-Control-Allow-Origin : *"헤더가 항상 존재합니다.

+0

크롬으로 테스트 하시겠습니까? - http://stackoverflow.com/a/10892392/775715 –

+0

@JoakimErdfelt 아니,뿐만 아니라. 브라우저는 Safari, Chrome 및 Firefox입니다. – JCvanDamme

답변