CORS(Cross-Origin Resource Sharing)란 무엇입니까? Java Jersey 웹 서버에 추가하는 방법은 무엇입니까?
게시 됨: 2014-07-19 client-server
통신 중에 이 오류를 수정하는 방법은 무엇입니까? 서버는 JSON 또는 XML 형식으로 데이터를 보내고 클라이언트는 예외 아래에 throw합니다.
1 2 3 |
XMLHttpRequest cannot load https : //crunchify.com/api/test. No 'Access-Control-Allow-Origin' header is present on the requested resource . Origin 'null' is therefore not allowed access . |
일반 웹 페이지는 XMLHttpRequest 개체를 사용하여 원격 서버에서 데이터를 보내고 받을 수 있지만 동일한 원본 정책에 의해 제한됩니다. 확장은 그렇게 제한되지 않습니다. 확장은 먼저 교차 출처 권한을 요청하는 한 원본 외부의 원격 서버와 통신할 수 있습니다.
또한 아래 질문이 있는 경우 올바른 위치에 있는 것입니다.
- 교차 출처 리소스 공유 이해(CORS 필터)
- 교차 출처 리소스 공유를 사용할 수 있습니까?
- 교차 출처 리소스 공유를 활성화하는 방법
- Cross-Origin 리소스 공유를 사용하는 Cross-domain Ajax란 무엇입니까?
- CORS(HTTP 액세스 제어)란 무엇입니까?
CORS(교차 출처 리소스 공유)는 웹 브라우저에서 교차 출처 요청을 가능하게 하기 위해 W3C에서 지원하는 메커니즘입니다. CORS가 작동하려면 브라우저와 서버 모두의 지원이 필요합니다. 이것은 Apache Tomcat 및 기타 내장 웹 서버와 같은 웹 컨테이너에 대한 서버 측 CORS의 Java Jersey 웹 서버 필터 구현입니다.
1 단계:
응답에는 리소스 콘텐츠에 대한 액세스를 허용하기 위해 요청이 시작된 출처를 값으로 하는 Access-Control-Allow-Origin 헤더가 포함될 수 있습니다. 사용자 에이전트는 요청이 시작된 곳의 값과 출처가 일치하는지 확인합니다.
2 단계:
사용자 에이전트는 프리플라이트 요청을 통해 교차 출처 리소스가 주어진 출처에서 간단하지 않은 방법을 사용하여 요청을 수락할 준비가 되었는지 확인할 수 있습니다. 이것은 사용자 에이전트에 의해 다시 확인됩니다.
3단계:
서버 측 애플리케이션은 HTTP 요청이 Origin 헤더를 통해 사용자 에이전트에 의해 교차 출처 요청으로 간주되었음을 발견할 수 있습니다. 이 확장을 통해 서버 측 응용 프로그램은 서비스할 의향이 있는 교차 출처 요청에 제한(예: 아무것도 반환하지 않음)을 적용할 수 있습니다.
이제 예제를 시작하겠습니다.
예-1: 자바 저지 웹 서버
몇 주 전에 저는 Java Application Startup 동안 Embedded HTTP Jersey 서버를 시작하는 방법에 대한 기사를 썼습니다. 이 게시물에서는 동일한 Jersey 서버에 CORS 필터를 추가하는 방법에 대한 단계를 다룹니다.
ContainerResponseFilter를 확장해야 합니다. 컨테이너 응답 필터에 의해 구현된 인터페이스입니다. 기본적으로, 즉 필터 구현 클래스에 이름 바인딩이 적용되지 않은 경우 필터 인스턴스는 나가는 응답에 전역적으로 적용됩니다.
이 문제를 해결하기 위해 서버 응답에 4개의 헤더를 추가해 보겠습니다.
- 접근-제어-허용-원점
- 액세스 제어 허용 방법
- 액세스 제어 최대 연령
- 액세스 제어 허용 헤더
CORS 필터 코드:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package com . crunchify . tutorial ; /** * * @author Crunchify.com */ import com . sun . jersey . spi . container . ContainerRequest ; import com . sun . jersey . spi . container . ContainerResponse ; import com . sun . jersey . spi . container . ContainerResponseFilter ; import javax . ws . rs . core . Response ; import javax . ws . rs . core . Response . ResponseBuilder ; public class CrunchifyCORSFilter implements ContainerResponseFilter { public ContainerResponse filter ( ContainerRequest req , ContainerResponse crunchifyContainerResponse ) { ResponseBuilder crunchifyResponseBuilder = Response . fromResponse ( crunchifyContainerResponse . getResponse ( ) ) ; // *(allow from all servers) OR https://crunchify.com/ OR http://example.com/ crunchifyResponseBuilder . header ( "Access-Control-Allow-Origin" , "https://crunchify.com/" ) // As a part of the response to a request, which HTTP methods can be used during the actual request. . header ( "Access-Control-Allow-Methods" , "API, CRUNCHIFYGET, GET, POST, PUT, UPDATE, OPTIONS" ) // How long the results of a request can be cached in a result cache. . header ( "Access-Control-Max-Age" , "151200" ) // As part of the response to a request, which HTTP headers can be used during the actual request. . header ( "Access-Control-Allow-Headers" , "x-requested-with,Content-Type" ) ; String crunchifyRequestHeader = req . getHeaderValue ( "Access-Control-Request-Headers" ) ; if ( null ! = crunchifyRequestHeader && !crunchifyRequestHeader.equals(null)) { crunchifyResponseBuilder.header("Access-Control-Allow-Headers", crunchifyRequestHeader); } crunchifyContainerResponse . setResponse ( crunchifyResponseBuilder . build ( ) ) ; return crunchifyContainerResponse ; } } |
이전 튜토리얼에서 JerseyEmbeddedHTTPServerCrunchify.java를 수정했습니다.

createHttpServer()에 아래 줄을 추가하고 서버를 다시 시작하십시오.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
결과:
http://localhost:8085/api
다음은 헤더 세부정보입니다.
예-2: Apache HTTP 서버
헤더를 표시하려면 <Directory>, <Location> 및 <Files> 섹션 또는 .htaccess
파일 내에 다음 줄을 추가할 수 있습니다.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
예-3: .NET 서버는 web.config에서 아래와 같이 구성할 수 있습니다.
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
예-4: Jetty(7 이상)의 경우
jetty-servlets JAR을 WEB-INF/lib에 포함하고 이것을 WEB-INF/web.xml에 병합합니다.
1 2 3 4 5 6 7 8 |
< filter > < filter - name > cross - origin < / filter - name > < filter - class > org . eclipse . jetty . servlets . CrossOriginFilter < / filter - class > < / filter > < filter - mapping > < filter - name > cross - origin < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
예-5: Apache Tomcat 서버(v 7.0.41 이상)
1 2 3 4 5 6 7 8 |
< filter > < filter - name > CorsFilter < / filter - name > < filter - class > org . apache . catalina . filters . CorsFilter < / filter - class > < / filter > < filter - mapping > < filter - name > CorsFilter < / filter - name > < url - pattern > /* < / url - pattern > < / filter - mapping > |
예-6: PHP에서
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
이에 대해 더 궁금한 사항이 있으면 알려주세요. 모든 Java 자습서 목록은 여기에서 찾을 수 있습니다.