Kaynaklar Arası Kaynak Paylaşımı (CORS) nedir – Java Jersey Web Sunucunuza nasıl eklenir?
Yayınlanan: 2014-07-19 client-server
iletişimi sırasında bu hatayı nasıl düzeltebilirim? Sunucu, verileri JSON veya XML biçiminde gönderir ve istemci, istisnanın altına atar.
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 . |
Normal web sayfaları, uzak sunuculardan veri göndermek ve almak için XMLHttpRequest nesnesini kullanabilir, ancak bunlar aynı kaynak ilkesiyle sınırlıdır. Uzantılar çok sınırlı değil. Bir uzantı, önce çapraz kaynak izinleri istediği sürece, kaynağının dışındaki uzak sunucularla konuşabilir.
Ayrıca, aşağıdaki sorularınız varsa, doğru yerdesiniz:
- Kaynaklar Arası Kaynak Paylaşımını Anlama (CORS Filtreleri)
- Kaynaklar Arası Kaynak Paylaşımını kullanabilir miyim
- Kaynaklar Arası Kaynak Paylaşımı Nasıl Etkinleştirilir
- Kaynaklar Arası Kaynak Paylaşımı ile Etki Alanları Arası Ajax Nedir?
- HTTP erişim denetimi (CORS) nedir?
CORS (Çapraz Kökenli Kaynak Paylaşımı), web tarayıcılarında çapraz kaynaklı istekleri etkinleştirmek için W3C tarafından desteklenen bir mekanizmadır. CORS'un çalışması için hem tarayıcıdan hem de sunucudan destek gerekir. Bu, Apache Tomcat ve diğer Gömülü Web Sunucuları gibi web kapsayıcıları için sunucu tarafı CORS'nin Java Jersey Web Sunucusu filtre uygulamasıdır.
Aşama 1:
Bir yanıt, kaynağın içeriğine erişime izin vermek için, değer olarak isteğin nereden kaynaklandığı ile birlikte bir Erişim-Kontrol-İzin Ver-Origin başlığı içerebilir. Kullanıcı aracısı, isteğin kaynaklandığı yerin değeri ve kaynağının eşleştiğini doğrular.
Adım 2:
Kullanıcı aracıları, bir ön kontrol isteği aracılığıyla, bir çapraz kaynak kaynağın, basit olmayan bir yöntem kullanarak belirli bir kaynaktan gelen istekleri kabul etmeye hazır olup olmadığını keşfedebilir. Bu, kullanıcı aracısı tarafından tekrar doğrulanır.
Aşama 3:
Sunucu tarafı uygulamaların, bir HTTP isteğinin Origin başlığı aracılığıyla kullanıcı aracısı tarafından bir çapraz kaynak isteği olarak kabul edildiğini keşfetmesi sağlanır. Bu uzantı, sunucu tarafı uygulamaların hizmet vermeye istekli oldukları çapraz kaynak istekleri üzerinde sınırlamaları (örneğin hiçbir şey döndürmeme) zorlamasını sağlar.
Şimdi Örneklerle başlayalım.
Örnek-1: Java Jersey Web Sunucusu
Birkaç hafta önce Java Uygulama Başlatma sırasında Gömülü HTTP Jersey sunucusunun Nasıl Başlatılacağı hakkında bir makale yazdım. Bu gönderi, aynı Jersey Sunucusuna CORS Filtresinin nasıl ekleneceğine ilişkin adımları kapsayacaktır.
ContainerResponseFilter'ı genişletmemiz gerekiyor. Kapsayıcı yanıt filtreleri tarafından uygulanan arabirim. Varsayılan olarak, yani filtre uygulama sınıfına ad bağlama uygulanmazsa, filtre örneği herhangi bir giden yanıta genel olarak uygulanır.
Bunu düzeltmek için, sunucu yanıtına aşağıdaki 4 başlığı eklemeyi deneyelim:
- Erişim-Kontrol-İzin Ver-Origin
- Erişim-Kontrol-İzin Ver-Yöntemleri
- Erişim-Kontrol-Max-Yaş
- Erişim-Kontrol-İzin-Üstbilgileri
CORS Filtre Kodu:
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'da önceki öğreticiden değişiklik.

Sadece createHttpServer() içine aşağıdaki satırı ekleyin ve sunucuyu yeniden başlatın.
1 |
crunchifyResourceConfig . getContainerResponseFilters ( ) . add ( CrunchifyCORSFilter . class ) ; |
Sonuç:
http://localhost:8085/api
İşte bir Başlık ayrıntıları.
Örnek-2: Apache HTTP Sunucusu
Başlığı göstermek için, <Directory>, <Location> ve <Files> bölümlerine veya bir .htaccess
dosyasına aşağıdaki satırı ekleyebilirsiniz.
1 2 3 |
< IfModule mod_headers . c > Header set Access - Control - Allow - Origin "*" < / IfModule > |
Örnek-3: .NET sunucusu bunu web.config içinde aşağıdaki gibi yapılandırabilir
1 2 3 4 5 6 |
< system . webServer > < httpProtocol > < customHeaders > < add name = "Access-Control-Allow-Origin" value = "your_clientside_websiteurl" / > < / customHeaders > < system . webServer > |
Örnek-4: İskele için (7 ve üzeri)
JAR jetty-servlet'lerini WEB-INF/lib'e dahil edin ve bunu WEB-INF/web.xml'nizle birleştirin
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 > |
Örnek-5: Apache Tomcat Sunucusu (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 > |
Örnek-6: PHP'de
1 2 3 |
<?php header ( "Access-Control-Allow-Origin: *" ) ; ?> |
Bu konuda başka sorunuz olursa lütfen bana bildirin. Tüm Java Eğitimlerinin listesi burada bulunabilir.