JAX-RS의 CORS

1. 개요

이 빠른 기사에서는 JAX-RS 기반 시스템 에서 CORS ( Cross-Origin Resource Sharing ) 를 활성화하는 방법에 대해 알아 봅니다 . CORS 메커니즘 을 활성화하기 위해 JAX-RS 위에 애플리케이션을 설정합니다 .

2. CORS 메커니즘을 활성화하는 방법

JAX-RS에서 CORS를 활성화하는 방법에는 두 가지가 있습니다. 첫 번째이자 가장 기본적인 방법은 모든 요청에서 런타임에 필요한 응답 헤더를 삽입하는 필터를 만드는 것입니다. 다른 하나는 각 URL 끝점에 적절한 헤더를 수동으로 추가하는 것입니다.

이상적으로는 첫 번째 솔루션을 사용해야합니다. 그러나 이것이 옵션이 아닌 경우 더 많은 수동 옵션도 기술적으로 괜찮습니다.

2.1. 필터 사용

JAX-RS 에는 컨테이너 응답 필터에 의해 구현 된 ContainerResponseFilter 인터페이스가 있습니다. 일반적으로이 필터 인스턴스는 모든 HTTP 응답에 전역 적으로 적용됩니다.

이 인터페이스를 구현 하여 각 나가는 요청에 Access-Control-Allow- * 헤더를 삽입 하고 CORS 메커니즘을 활성화 하는 사용자 지정 필터를 생성합니다 .

@Provider public class CorsFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { responseContext.getHeaders().add( "Access-Control-Allow-Origin", "*"); responseContext.getHeaders().add( "Access-Control-Allow-Credentials", "true"); responseContext.getHeaders().add( "Access-Control-Allow-Headers", "origin, content-type, accept, authorization"); responseContext.getHeaders().add( "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD"); } }

여기에 몇 가지 요점이 있습니다.

  • ContainerResponseFilter 를 구현하는 필터 는 JAX-RS 런타임이 감지 할 수 있도록 @Provider 로 명시 적으로 어노테이션을 작성 해야 합니다.
  • '*' 가 포함 된 ' Access-Control-Allow- * '헤더를 삽입합니다. 즉,이 서버 인스턴스에 대한 모든 URL 끝점은 모든 도메인을 통해 액세스 할 수 있습니다. 도메인 간 액세스를 명시 적으로 제한하려면이 헤더에서 해당 도메인을 언급해야합니다.

2.2. 각 끝점에 헤더 수정 사용

앞서 언급했듯이 엔드 포인트 수준에서도 ' Access-Control-Allow- * '헤더를 명시 적으로 삽입 할 수 있습니다.

@GET @Path("/") @Produces({MediaType.TEXT_PLAIN}) public Response index() { return Response .status(200) .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Credentials", "true") .header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization") .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD") .entity("") .build(); }

여기서 주목할 점 은 대규모 애플리케이션에서 CORS 를 활성화 하려는 경우이 방법을 시도해서는 안된다는 것입니다.이 경우 추가 오버 헤드를 발생시키는 모든 URL 끝점에 헤더를 수동으로 삽입해야하기 때문입니다.

그러나이 기술은 일부 URL 끝점에서만 CORS 를 활성화해야하는 응용 프로그램에서 사용할 수 있습니다 .

3. 테스트

응용 프로그램이 실행되면 curl 명령을 사용하여 헤더를 테스트 할 수 있습니다. 샘플 헤더 출력은 다음과 같아야합니다.

HTTP/1.1 200 OK Date : Tue, 13 May 2014 12:30:00 GMT Connection : keep-alive Access-Control-Allow-Origin : * Access-Control-Allow-Credentials : true Access-Control-Allow-Headers : origin, content-type, accept, authorization Access-Control-Allow-Methods : GET, POST, PUT, DELETE, OPTIONS, HEAD Transfer-Encoding : chunked

또한 간단한 AJAX 함수를 만들고 도메인 간 기능을 확인할 수 있습니다.

function call(url, type, data) { var request = $.ajax({ url: url, method: "GET", data: (data) ? JSON.stringify(data) : "", dataType: type }); request.done(function(resp) { console.log(resp); }); request.fail(function(jqXHR, textStatus) { console.log("Request failed: " + textStatus); }); };

물론 실제로 확인을 수행하려면 사용중인 API가 아닌 다른 출처에서이를 실행해야합니다.

포트가 오리진을 결정하므로 별도의 포트에서 클라이언트 앱을 실행하여 로컬에서 매우 쉽게 수행 할 수 있습니다 .

4. 결론

이 기사에서는 JAX-RS 기반 애플리케이션에서 CORS 메커니즘을 구현하는 방법에 대해 설명했습니다 .

항상 그렇듯이 전체 소스 코드는 GitHub에서 사용할 수 있습니다.